Java 17 to najnowsze wydanie LTS (long-term support). Co nowego znajdziemy w tej edycji. O tym wszystkim dowiesz się z niniejszego artykułu.
Java 17 – co w środku?
Java 17 nie zaskakuje nas liczbą rozszerzeń do JDK. Mamy tym razem do czynienia z 14 głównymi zmianami. Czyli trzy mniej poprzednie wydanie.
Poniżej zestawienie:
Obszar | JDK Enhancement Proposal (JEP) |
Rozszerzenia języka na stałe | 409: Sealed Classes |
Aktualizacje i ulepszenia | 306: Restore Always-Strict Floating-Point Semantics to dla mnie zmiana praktycznie niezauważalna. 356: Enhanced Pseudo-Random Number Generators 382: New macOS Rendering Pipeline 415: Context-Specific Deserialization Filters |
Inkubator i Preview | 406: Pattern Matching for switch (Preview) 412: Foreign Function & Memory API (Incubator) 414: Vector API (Second Incubator) |
Uwidocznienie niekompatybilności | 403: Strongly Encapsulate JDK Internals |
Integracja portów | 391: macOS/AArch64 Port |
Oznaczone jako przestarzałe lub usunięte | 398: Deprecate the Applet API for Removal 407: Remove RMI Activation 410: Remove the Experimental AOT and JIT Compiler 411: Deprecate the Security Manager for Removal |
Rozszerzenia języka na stałe
409: Sealed Classes to ciekawa zmiana umożliwiająca klasie lub interfejsowi typu sealed na zdefiniowanie, które klasy lub interfejsy będą mogły je rozszerzać lub implementować. Wynika z tego, że programista będzie miał większą kontrolę nad kodem. Sam kod ma być w tym obszarze bardziej deklaratywny. Przykłady:
package com.example.geometry;
public sealed class Shape
permits Circle, Rectangle, Square {...}
Mamy zatem dwa nowe keywords, tj. sealed i permits.
Idąc dalej przy ograniczeniu typów nasuwa się skojarzenie z Case Classes ze Scali. I w tym przypadku to skojarzenie jest jak najbardziej trafne. Pattern matching w switch fajnie z tym współgra/ Przykład poniżej.
Shape rotate(Shape shape, double angle) {
return switch (shape) {
case Circle c -> c; // no action needed
case Rectangle r -> r.rotate(angle);
case Square s -> s.rotate(angle);
}
}
Aktualizacje i ulepszenia
306: Restore Always-Strict Floating-Point Semantics to dla większości z nas zmiana praktycznie niezauważalna. Wracamy do semantyki strict w obsłudze liczb zmiennoprzenikowych.
Ulepszeniu ulegają również generatory liczb pseudolosowych w ramach 356: Enhanced Pseudo-Random Number Generators.
Fanów macOS ucieszy, że od teraz Java 2D będzie korzystała z Apple Metal API zamiast przestarzałego Apple OpenGL API. A to za sprawą 382: New macOS Rendering Pipeline.
Dzięki 415: Context-Specific Deserialization Filters będzie możliwość konfiguracji filtrów dynamicznie w zależności od kontekstu deserializacji.
Inkubator i Preview
Na początek fajny feature, który swoje źródło w projekcie Amber.
Dla przypomnienia, projekt Amber ma na celu wprowadzanie do języka Java małych rozwiązań, które zwiększą produktywność developerów. W skrócie, żeby platforma była fajniejsza i idąca z duchem czasu.
Stąd też w obecnym wydaniu otrzymujemy 406: Pattern Matching for switch (Preview). Czyli długo oczekiwany pattern matching w ramach instrukcji switch. Będziemy mogli teraz trochę poszaleć. Przykład z JEP poniżej:
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
Piszący w Scali mogą się tutaj z politowaniem uśmiechnąć 😊
Wywoływanie kodu z bibliotek natywnych, jak również i zabawa z dostępem do pamięci poza stertą to dwie rzeczy, które od dość dawna stanowią pewien kłopot dla programistów. W Java 17 dostajemy bardzo wstępną wersję nowego API w 412: Foreign Function & Memory API (Incubator). Sam JEP jest w zasadzie kolejnym krokiem w rozwoju dwóch wcześniejszych podejść do tego tematu. Czyli znanych z JDK 16 389: Foreign Linker API (Incubator) i 393: Foreign-Memory Access API (Third Incubator). Widać więc, że zmiany idą powoli do przodu. Na wersję docelową jeszcze trochę poczekamy, bo to trudny obszar i musi być bardzo dobrze dopracowany.
Dalsze prace nad obliczeniami wektorowymi owocują 414: Vector API (Second Incubator). W tym przypadku walka idzie o jak najlepsze przełożenie instrukcji wektorowych na realizację zadania na CPU. Ok, brzmi to i tak trochę skomplikowanie.
Integracja portów
391: macOS/AArch64 Port oznacza w zasadzie dostarczenie wersji JDK dla macOS z natywnym wsparciem Arm 64.
Oznaczenie niekompatybilności
W ramach 403: Strongly Encapsulate JDK Internals JDK zmienia domyślny typ enkapsulacji z relaxed strong encapsulation na strong encapsulation. Oczywiście bez sun.misc.Unsafe. Ale mimo wszystko prace idą w dobrym kierunku.
Oznaczone jako przestarzałe lub usunięte
Czy będziesz płakać z powodu 398: Deprecate the Applet API for Removal. Pewnie nie. Zresztą żadna szanująca się przeglądarka nie planuje w przyszłości wspierać pluginów Javy. Także za chwilę to API zniknie z JDK.
Jeśli miałeś kiedyś do czynienia z RMI Activation to pewnie ucieszy Cię wiadomość, że dzięki 407: Remove RMI Activation już nigdy ten mechanizm nie będzie dostępny w nowych odsłonach Java. Biorąc pod uwagę, że wśród moich znajomych pytanie o RMI Activation kończyło się odpowiedziamy, że słyszeli o tym kiedyś na studiach, to … stratę przebolejemy 😊
Wprowadzone jako eksperyment w JDK 9 kompilatory AOT (ahead-of-time) i JIT (just-in-time) już całkowicie znikają z kodu OpenJDK za sprawą 410: Remove the Experimental AOT and JIT Compiler. Nikt Niewiele osób pewnie będzie za nimi tęsknić.
Żegnamy również Security Managera. A to za sprawą oznaczenia 411: Deprecate the Security Manager for Removal. Samo API pobędzie jeszcze trochę w JDK. Jednak od wersji 18 jego działanie będzie coraz bardziej ograniczane, aż w końcu nie będzie wykonywało żadnego sprawdzania uprawnień.
Java 17 – podsumowanie
No to jak z tą Java 17 jest? Jesteśmy zadowoleni z tego, co się w niej pojawiło? A może wręcz przeciwnie?
Java 17 to tak naprawdę 14 głównych zmian i bardzo dużo mniejszych i większych poprawek w całym JDK. Czy jest się z czego cieszyć?
Musimy pamiętać, że najnowszy LTS zawiera nie tylko zmiany z edycji 17, ale również i te od 12 do 16. Oznacza to, że
Jeśli czytałeś ostatnią książkę Cixin Liu O mrówkach i dinozaurach lub kojarzysz Trisolarian z jego trylogii Wspomnienie o przeszłości Ziemi i jej rozwiniętych wątków przez Baoshu w Odzyskanie czasu to wiesz, że duża wielkość niekoniecznie oznacza coś lepszego.
Mniej zmian, ale rzeczywiście dobrych, daje dużą wartość. Biorąc pod uwagę niechęć do używania w środowisku korporacyjnym wydań non-LTS to edycja Java 17 stanowi duży krok naprzód. Zwłaszcza dla historyków Java 8. Do których w niektórych starszych projektach też się zaliczam 😊
A jeśli doczytałeś do końca to znaczy, że temat jest dla Ciebie interesujący. Będzie mi niezmiernie miło jeśli zostawisz komentarz. Daj znać, co myślisz? Podoba Ci się najnowsze wydanie Java?
O kolejnych wydaniach Javy możesz przeczytać w artykułach: