Kategorie
java

Java 17 – co nowego?

Java 17 to najnowsze wydanie LTS (long-term support). Co nowego znajdziemy w tej edycji. O tym wszystkim dowiesz się z niniejszego artykułu.

junior-hava-developer-handbook-what-to-know

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:

ObszarJDK Enhancement Proposal (JEP)
Rozszerzenia języka na stałe409: Sealed Classes
Aktualizacje i ulepszenia306: 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 Preview406: Pattern Matching for switch (Preview)
412: Foreign Function & Memory API (Incubator)
414: Vector API (Second Incubator)
Uwidocznienie niekompatybilności403: Strongly Encapsulate JDK Internals
Integracja portów391: macOS/AArch64 Port
Oznaczone jako przestarzałe lub usunięte398: 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 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?

5 4 votes
Article Rating
Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments