Co się zmieniło w Javie po wersji 7?
Język Java - zmiany, zmiany…
Co zmieniło się w Javie od wersji 7? Przyjrzę się bliżej zmianom wprowadzanym do języka (w nowym cyklu wydań - co pół roku) i w kolejnych wpisach spróbuję nadgonić zaległości (mój urlop wychowawczy zaczął się w 2019, a wcześniej mój pracodawca dopiero rozważał migrację do Java 8).
Na wrzesień tego roku planowane jest wydanie 17 (Long Term Support). Kto wie, może po powrocie z urlopu wychowawczego trafię do projektu typu “green field” rozwijanego właśnie w najnowszj wersji Javy?
Poniżej lista wersji z najważniejszymi zmianami.
Lista wersji z najważnejszymi zmianami
Java 8 (spec)
- długo oczekiwane wyrażenia lambda [spec]
- bogactwo rozszerzeń w bibliotece do operacji na strumieniach
- solidne API do obsługi dat i czasu, np. API LocalDateTime
- metody domyślne w interfejsach pozwalające na “wielodziedziczenie” zachowania
Przeczytaj również:
Java 9 spec
Ogromna zmiana - modularyzacja. Musi minąć dużo czasu zanim ekosystem zacznie publikować biblioteki w formie modułów. Na razie zmodularyzowano bibliotekę standardową.
- moduły ( spec, wprowadzenie “Quick start guide”)
- REPL (JShell)
- How to get JShell documentation, 10 things about JShell from Redhat, Oracle tutorial on JShell
- istnieje nawet projekt IJava (tzw. kernel) pozwalający na używanie Javy w Jupiterze
- poprawki w klasie Optional umożliwiające elegancki chaining w przypadku braku wartości:
ifPresentOrElse(Consumer<T> action, Runnable emptyAction)
or(Supplier<Optional<T> other)
stream()
- metody static factory w interfejsach kolekcji umożliwiające tworzenie “któtkich” (w bibliotece są warianty overloaded do 10 elementów), niemodyfikowalnych kolekcji: List.of(), Set.of()
Po wielu latach używania REPL-a w językach takihc jak Haskell, Clojure, Python czy choćby JavaScript (w konsoli przeglądarki) w końcu doczekałam się REPL-a dla Javy. Zawsze bardzo ceniłam sobie możliwość szybkiego zaprototypowania funkcji czy sprawdzenia, jak zachowuje się jakieś API. JShell istniał wcześniej jako niezależny projekt, ale dopiero dodanie go do SDK sprawiło, że stał się dostępny i użyteczny. Daleko mu do funkcjonalności ipython3, ale lepszy wróbel w garści.
O Java 9 przeczytasz również w artykułach:
- Praktyczy przykład: trzy moduły
- Czy mogę stworzyć z mojej aplikacji binarkę?
- Java 9 - nowości w bibliotece
- Java 9 - co to jest JShell i dlaczego warto używać REPL-a
Java 10 (spec)
- local variable type inference - czyli możliwość deklarowania zainicjowanych zmiennych lokalnych bez podawania typu (typ określony jest na podstawie typu wyrażenia inicjującego zmienną)
Przeczytaj również:
Java 11 - LTS (spec)
- HTTP Client (JEP-321, API)
- możliowść użycia *var* w parametrach lambdy (JEP-323)
- uruchamianie programów z jednym plikiem źródłowym (kompilacja “w tle”) (JEP-330)
Niestety, w tej wersji:
- zlikwidowano możliwość uruchamiania aplikacji przy użyciu mechanizmu Java Web Start oraz
- usunięto z biblioteki standardowej pakiety JavaFX (są teraz oddzielnym modułem rozwijanym niezależnie w ramach OpenJFX)
Przeczytaj również:
Java 12 (spec)
Przeczytaj również:
Java 13 (spec)
- bloki tekstowe (spec, JEP-355) wprowadzone jako
preview
- wyrażenie switch (spec, JEP-325) w daszym ciągu
preview
Java 14 (spec)
- ustandaryzowane switch expressions
- rekordy (spec, JEP-359) wprowadzone jako
preview
- bloki tekstowe (spec, JEP-355) wciąż
preview
- pattern matching w
instanceof
(spec, JEP-305) wciążpreview
Przeczytaj również:
Java 15 (spec)
- ustandaryzowane bloki tekstowe (spec, JEP-355)
- sealed classess (JEP-360, spec) wprowadzone jako
preview
- rekordy (spec) wciąż
preview
- pattern matching w
instanceof
(spec) wciążpreview
Przeczytaj również:
Java 16 (spec)
- ustandaryzowany pattern matching w
instanceof
- ustandaryzowane rekordy
- sealed classess (JEP-360, spec) wciąż
preview
Przeczytaj również:
Java 17 i dalej
Dwa interesujące projekty, których czas “lądowania” w konkretnej wersji nie został jeszcze przesądzony, to:
- Valhalla wprowadzający tzw.
value types
, czyli obiekty bez tożsamości, z efektywnym rozmieszczeniem w pamięci - Loom wprowadzający wirtualne wątki (zwane też zielonymi wątkami, kolejkowane w przestrzeni użykownika, w ramach JVM, a nie przez system operacyjny)
Co mam na swoim laptopie
|
|
W wersji 14 mogę używać w zasadzie wszystkich nowości poza sealed classes
więc na razie mam całkiem duże pole do eksperymentów. W kolejnych postach wrzucę może garść prostych przykładów.