Spis treści

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)

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ą.

  • 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:

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)

  • wyrażenie switch (spec, JEP-325) wprowadzone jako preview

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

1
2
3
4
λ  java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment
OpenJDK 64-Bit Server VM

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.