Po sześciu miesiącach prac rozwojowych firma Oracle wydała platformę Java SE 20 (Java Platform, Standard Edition 20), której etalonową implementacją jest otwarty projekt OpenJDK. Z wyjątkiem usunięcia niektórych przestarzałych funkcji, Java SE 20 zachowuje zgodność z wcześniejszymi wersjami platformy Java — większość wcześniej napisanych projektów Java będzie działać bez zmian w nowej wersji. Gotowe do zainstalowania pakiety Java SE 20 (JDK, JRE i Server JRE) są dostępne dla systemów Linux (x86_64, AArch64), Windows (x86_64) oraz macOS (x86_64, AArch64). Etalonowa implementacja Java 20, opracowana w ramach projektu OpenJDK, jest w pełni otwarta na licencji GPLv2 z wyjątkami GNU ClassPath, które umożliwiają dynamiczne łączenie z produktami komercyjnymi.
Java SE 20 zaliczana jest do wydania z normalnym okresem wsparcia, dla którego aktualizacje będą wydawane do następnej wersji. Do tego celu należy stosować wersję Java SE 17, która jest wersją z długoterminowym wsparciem (LTS) i aktualizacje dla niej będą wydawane do 2029 roku. Przypomnijmy, że od wersji Java 10 projekt przeszedł na nowy proces rozwoju, który przewiduje krótszy cykl wprowadzania nowych wydań. Nowe funkcjonalności są teraz opracowywane w jednej stale aktualizowanej gałęzi master, do której włączane są gotowe zmiany, a co sześć miesięcy odgałęziają się nowe gałęzie dla stabilizacji nowych wydań.
Wśród nowości Java 20 można wyróżnić:
- Wprowadzono wstępną obsługę ograniczonych wartości (Scoped Values), umożliwiających współdzielenie niezmiennych danych w wątkach oraz efektywną wymianę danych pomiędzy wątkami podrzędnymi (wartości są dziedziczone). Scoped Values rozwijają się, aby zastąpić mechanizm zmiennych lokalnych dla wątków (thread-local variables) i są bardziej efektywne przy korzystaniu z bardzo dużej liczby wirtualnych wątków (tysięcy i milionów wątków). Główna różnica między Scoped Values a zmiennymi lokalnymi dla wątków polega na tym, że pierwsze są zapisywane raz, nie mogą być później zmieniane i pozostają dostępne tylko w czasie wykonywania wątku. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized() ? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(…); } }
- Dodano drugą wstępną realizację wzorców rekordów (record pattern), rozszerzającą możliwością dopasowywania z użyciem mechanizmów rozkładu wartości klas typu record, która pojawiła się w Javie 16. Na przykład: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
- Dodano czwartą wstępną realizację dopasowywania wzorców w wyrażeniach „switch”, która pozwala w etykietach „case” używać nieprecyzyjnych wartości, ale elastycznych wzorców, obejmujących szereg wartości, dla których wcześniej trzeba było stosować rozbudowane łańcuchy wyrażeń „if…else”. static String formatterPatternSwitch(Object obj) { return switch (obj) { 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(); }; }
- Dodano drugą wstępną realizację API FFM (Foreign Function & Memory), umożliwiającego interakcję programów Java zewnętrznym kodem i danymi poprzez wywoływanie funkcji z zewnętrznych bibliotek oraz dostęp do pamięci poza JVM.
- Dodano drugą wersję wstępnej realizacji wirtualnych wątków, które są lekkimi wątkami, znacznie ułatwiającymi pisanie i utrzymanie wysoko wydajnych aplikacji wielowątkowych.
- Dodano drugą wersję eksperymentalnego API dla strukturalnego współbieżności, które ułatwia rozwój aplikacji wielowątkowych poprzez przetwarzanie wielu zadań wykonywanych w różnych wątkach jako jednego bloku.
- Dodano piątą wersję wstępnej realizacji API Vector, oferującego funkcje do obliczeń wektorowych, które są wykonywane z użyciem instrukcji wektorowych procesorów x86_64 i AArch64, pozwalając na jednoczesne stosowanie operacji na wielu wartościach (SIMD). W przeciwieństwie do możliwości automatycznej wektoryzacji operacji skalarnych oferowanych przez kompilator JIT HotSpot, nowe API umożliwia wyraźne zarządzanie wektoryzacją dla równoległego przetwarzania danych.
Źródło: opennet.ru
