Java 17 - poznaj wszystkie nowości
Java 17 - poznaj wszystkie nowości języka i platformy
Oracle ogłosił news, że dziś (14 września 2021) Java 17 została wydana. Co ważne jest to wersja LTS (ostatnią z taką licencją do tej pory była Java 11) więc będzie wspierane aż przez 5 lat. Dlatego szczególnie warto przyjrzeć się nowościom. W tej wersji wcielono 14 JEP-ów (JDK Enhancement Proposal) i przejdziemy przez nie wszystkie, żeby zobaczyć, co tak naprawdę zawiera to wydanie.
Klasy zapieczętowane
To chyba największa nowość w Javie 17. Klasy zapieczętowane (JEP 409) wychodzą z fazy preview i stają się częścią standardowej Javy. Tego typu klasy (i interfejsy) pozwalają ograniczyć, które klasy mogą je rozszerzać lub implementować. Oto przykład:
package com.example.geometry; public abstract sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square { ... }
Warto też tu wspomnieć o 3 warunkach, które muszą spełnić klasy zapieczętowane:
- klasa zapieczętowana i jej podklasy muszą należeć do tego samego modułu lub pakietu (jeżeli moduł jest nienazwany)
- Każda podklasa musi wprost rozszerzać klasę zapieczętowaną
- Każda podklasa musi określić, jak będzie się propagować zapieczętowanie (można określić tu modyfikator final, selead i kontynuować temat lub non-sealed i otworzyć tym samym klasę)
Bezpieczniejsza deserializacja
Deserializowanie danych niewiadomego pochodzenia może być niebezpieczne, dlatego jedną z nowości jest wybieranie filtrów do deserializacji w konkretnym kontekście za pomocą pojedynczej fabryki filtrów (JEP 415). Wcześniej można było korzystać ze statycznego filtra dla całego JVM lub ewentualnie zmienić go na inny. Teraz za każdym razem, gdy tworzymy ObjectInputStream
, to fabryka filtrów zwraca nam filtr, który jest dynamiczny i dopasowany do kontekstu. Filtry wprowadzone w Javie 9 nadal będą działać tak, jak działały, o ile nie pojawi się kolejna implementacja.
Funkcje eksperymentalne
Od Javy 14 mamy nowiutką składnię switch, od Javy 16 mamy dopasowanie wzorców, więc możecie się domyślić, co przynosi obecna wersja. Tak, wydanie LTS Java 17 daje dopasowanie wzorców w switch (JEP 406, jest to funkcja preview). To nic dziwnego, biorąc pod uwagę, że od początku było to celem wprowadzenia “pattern matchingu”. Funkcja ta pozwala zrobić coś takiego:
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(); }; }
To ładna i zwięzła składnia, podobna do tej, w innych językach programowania, jak C# czy Ruby.
Poziom niżej, czyli jako funkcje w inkubatorze mamy dwa JEP-y. Pierwszy, JEP 412, to kolejny etap prac na API do wywoływania obcego kodu i zarządzania pamięcią poza stosem Javy. Celem jest tu zastąpienie JNI.
Po raz drugi w inkubatorze pojawia się Vector API (JEP 414), które, jak nazwa wskazuje, ma umożliwić łatwe operowanie na wektorach. Tym razem pojawiły się tylko drobne poprawki, związane z feedbackiem społeczności.
Usprawnienia
Łatwiejszy development
JEP 306 zapewni, że operacje zmiennoprzecinkowe będą od teraz zawsze wykonywane w trybie strict. Java SE 1.2 wprowadziła zamieszanie dając możliwość używania trybu strict lub default. Dla osób, które nie siedzą po uszy w operacjach zmiennoprzecinkowych, może nie być dużej różnicy, jednak ułatwi to życie developerom bibliotek obliczeniowych.
Lepszy interfejs generatorów pseudolosowych
Porządków doczekały się też generatory pseudolosowe (JEP 356), tu znowu chodziło o uzyskanie spójnego interfejsu, który zapewni “przewidywalne” i bezpieczne wyniki. Najnowszy interfejs nazywa się RandomGenerator, ale mało prawdopodobne, że będziesz go kiedykolwiek używać bezpośrednio, raczej będą z niego korzystać PRNG.
Oracle JDK 17
Nie będzie można dobrać się już do wnętrzności JDK (JEP 403), chodzi tu głównie o metody i pola z pakietów org.*, jdk.*, com.sun.*. Od Javy 9 do Javy 16 dostęp do nich był możliwy, jeżeli użyło się odpowiedniej flagi, teraz już nie będzie to możliwe.
Java 17 zawiera nowe opcje dla Maca
Po pierwsze Java zadziała na Apple Silicon dzięki JEP 391, czyli od teraz nie powinno być problemów w Javą na M1. Druga nowość od Oracle to API do rysowania na macOS (JEP 382). Używa ono Apple Metal API, co stwarza alternatywę dla Apple OpenGL, które jest już przestarzałe.
Funkcjonalności do wyrzucenia
Jak zawsze usuwane jest parę funkcji:
- API appletów zostaje oznaczone jako przestarzałe i do usunięcia (JEP 398)
- Usunięcie Remote Method Invocation (RMI) Activation, przy czym RMI zostaje w Javie (JEP 407)
- Usunięcie eksperymentalnych kompliatorów JIT i AOT (JEP 410) - tu zalecane jest użycie zewnętrznych narzędzi i kompilatorów, np. GraalVM
- Security Manager, czyli narzędzie do zabezpieczania kodu klienckiego w Javie, zostaje oznaczone jako do usunięcia
Podsumowanie wersji 17 Javy
Aktualizacja Java 17 od firmy Oracle może nie dostarcza programistom porywających nowości, w końcu przez 6 miesięcy nie można wprowadzić zbyt wielu zmian. W zasadzie stabilizuje on zmiany, które pojawiały się w przeciągu ostatnich paru wersji i utrwala kanon funkcji, które będą szerzej wykorzystywane przez kilka następnych lat w świecie platformy i języka Javy.
Pamiętajcie, że od ostatniego LTS, czyli od września 2018, pojawiły się w Javie:
- Rekordy
- Nowa składnia switch
- Dopasowanie wzorców
- Klasy zapieczętowane
- Nowa składnia dla wielolinijkowych bloków tekst
I to całkiem spore zmiany, biorąc pod uwagę, że mówimy o tak dojrzałym języku jak Java.
Edit: Sprawdź, jakie nowości pojawiły się w Java 18. Kolejną Javą z supportem LTS ma być Java 21 z wydaniem we wrześniu 2023.