Po sześciu miesiącach rozwoju firma Oracle wydała platformę Java SE 18 (Java Platform, Standard Edition 18), która wykorzystuje projekt open source OpenJDK jako implementację referencyjną. Z wyjątkiem usunięcia niektórych przestarzałych funkcji, Java SE 18 zachowuje wsteczną kompatybilność z poprzednimi wersjami platformy Java – większość wcześniej napisanych projektów Java będzie działać bez zmian w nowej wersji. Gotowe do instalacji kompilacje Java SE 18 (JDK, JRE i Server JRE) są przygotowane do… Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Opracowana przez projekt OpenJDK, implementacja referencyjna Java 18 jest w pełni open source na licencji GPLv2 z wyjątkiem GNU ClassPath, który umożliwia dynamiczne łączenie z produktami komercyjnymi.
Java SE 18 jest sklasyfikowana jako zwykła wersja wsparcia, z aktualizacjami, które zostaną wydane przed kolejną wersją. Gałąź wsparcia długoterminowego (LTS) powinna być Java SE 17, która będzie otrzymywać aktualizacje do 2029 roku. Przypomnijmy, że począwszy od wydania Java 10, projekt przeszedł na nowy proces rozwoju, co oznacza krótszy cykl tworzenia nowych wydań. Nowa funkcjonalność jest obecnie rozwijana w jednej, stale aktualizowanej gałęzi głównej, która zawiera już dokonane zmiany iz której gałęzie są rozgałęziane co pół roku w celu ustabilizowania nowych wydań.
Nowe funkcje w Javie 18 obejmują:
- Domyślnie kodowanie to UTF-8. Interfejsy API Java przetwarzające dane tekstowe w oparciu o kodowanie znaków będą teraz domyślnie używać UTF-8 na wszystkich platformach, niezależnie od ustawień systemowych i ustawień regionalnych. Aby powrócić do starego zachowania, w którym kodowanie jest wybierane na podstawie ustawień regionalnych systemu, możesz użyć opcji „-Dfile.encoding=COMPAT”.
- Pakiet zawiera pakiet com.sun.net.httpserver, który zawiera narzędzie jwebserver i API biblioteki z implementacją prostego serwera http do serwowania treści statycznych (nie są obsługiwane CGI ani procedury obsługi podobne do serwletów). Wbudowany serwer HTTP nie jest zoptymalizowany pod kątem obciążeń i nie obsługuje kontroli dostępu ani uwierzytelniania, ponieważ jest przeznaczony przede wszystkim do wykorzystania w procesie rozwoju do prototypowania, debugowania i testowania projektów.
- JavaDoc zapewnia obsługę tagu „@snippet” umożliwiającego osadzanie działających przykładów i fragmentów kodu w dokumentacji API, gdzie można używać narzędzi do sprawdzania poprawności, podświetlania składni i integracji z IDE.
- Przeprojektowano implementację API java.lang.reflect (Core Reflection), służącego do pozyskiwania informacji o metodach, polach i konstruktorach klas, a także dostępu do wewnętrznej struktury klas. Sam interfejs API java.lang.reflect pozostaje niezmieniony, ale jest teraz zaimplementowany przy użyciu uchwytów metod dostarczonych przez moduł java.lang.invoke, zamiast korzystać z generatorów kodu bajtowego. Zmiana pozwoliła nam ujednolicić implementacje java.lang.reflect i java.lang.invoke oraz uprościć ich konserwację.
- Zaproponowano trzecią wersję zapoznawczą Vector API, udostępniającą funkcje obliczeń wektorowych, które są wykonywane przy użyciu instrukcji wektorowych na procesorach x86_64 i AArch64 i umożliwiają jednoczesne stosowanie operacji na wielu wartościach (SIMD). W przeciwieństwie do możliwości kompilatora HotSpot JIT do automatycznej wektoryzacji operacji skalarnych, nowy interfejs API umożliwia jawną kontrolę wektoryzacji dla równoległego przetwarzania danych.
- Dodano SPI (interfejs dostawcy usług) do rozwiązywania nazw hostów i Adresy IP, co pozwala java.net.InetAddress na używanie alternatywnych resolverów, które nie są powiązane z procedurami obsługi oferowanymi przez system operacyjny.
- Dostępna jest druga wersja zapoznawcza interfejsu API funkcji zagranicznych i pamięci, umożliwiająca aplikacjom interakcję z kodem i danymi poza środowiskiem wykonawczym Java. Nowy interfejs API umożliwia wydajne wywoływanie funkcji innych niż JVM i uzyskiwanie dostępu do pamięci zarządzanej przez inną maszynę. Można na przykład wywoływać funkcje z zewnętrznych bibliotek współdzielonych i uzyskiwać dostęp do danych procesowych bez użycia JNI.
- Dodano drugą eksperymentalną implementację dopasowywania wzorców w wyrażeniach typu „switch”, pozwalającą na użycie elastycznych wzorców w etykietach „case” zamiast dokładnych wartości, obejmujących jednocześnie szereg wartości, dla których wcześniej konieczne było użycie kłopotliwe łańcuchy wyrażeń „if...else”. Obiekt o = 123L; String sformatowany = przełącznik (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("podwójne %f", d); case String s -> String.format("Ciąg %s", s); domyślnie -> o.toString(); };
- Mechanizm finalizacji i powiązane z nim metody, takie jak Object.finalize(), Enum.finalize(), Runtime.runFinalization() i System.runFinalization() są przestarzałe i zostaną wyłączone w przyszłej wersji.
- Moduły zbierające elementy bezużyteczne ZGC (Z Garbage Collector), SerialGC i ParallelGC obsługują deduplikację wierszy.
Źródło: opennet.ru
