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.
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)
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.
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.
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.
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.
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.
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.
Jak zawsze usuwane jest parę funkcji:
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:
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.