wydanie Javy SE 17

Po sześciu miesiącach prac rozwojowych firma Oracle wydała platformę Java SE 17 (Java Platform, Standard Edition 17), która wykorzystuje projekt open source OpenJDK jako implementację referencyjną. Z wyjątkiem usunięcia niektórych przestarzałych funkcji, Java SE 17 zachowuje kompatybilność wsteczną z poprzednimi wersjami platformy Java — większość wcześniej napisanych projektów Java będzie nadal działać bez modyfikacji, gdy zostaną uruchomione w nowej wersji. Gotowe do zainstalowania wersje Java SE 17 (JDK, JRE i Server JRE) są przygotowane dla systemów Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Opracowana w ramach projektu OpenJDK implementacja referencyjna Java 17 jest w pełni otwarta na licencji GPLv2 z wyjątkami GNU ClassPath, aby umożliwić dynamiczne łączenie z produktami komercyjnymi.

Java SE 17 jest klasyfikowana jako wersja z obsługą długoterminową (LTS), która będzie otrzymywać aktualizacje do 2029 roku. Aktualizacje poprzedniej wersji kamienia milowego Java 16 zostały wycofane. Poprzednia gałąź LTS Java 11 będzie obsługiwana do 2026 roku. Następna wersja LTS zaplanowana jest na wrzesień 2024 r. 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 teraz rozwijana w jednej, stale aktualizowanej gałęzi głównej, która zawiera gotowe zmiany i z której co sześć miesięcy rozgałęziają się gałęzie w celu stabilizacji nowych wydań.

Nowe funkcje w Javie 17 obejmują:

  • Zaproponowano eksperymentalną implementację dopasowywania wzorców w wyrażeniach „switch”, która pozwala na użycie nie dokładnych wartości w etykietach „case”, ale elastycznych szablonów obejmujących szereg wartości na raz, dla których wcześniej konieczne było użycie uciążliwych łańcuchy wyrażeń „if...else”. Dodatkowo „switch” ma możliwość obsługi wartości NULL. 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(); };
  • Stabilizowana obsługa zapieczętowanych klas i interfejsów, których nie mogą używać inne klasy i interfejsy do dziedziczenia, rozszerzania lub zastępowania implementacji. Klasy zapieczętowane zapewniają również bardziej deklaratywny sposób ograniczenia użycia nadklasy niż modyfikatory dostępu, w oparciu o jawną listę podklas dozwolonych do rozszerzenia. pakiet com.example.geometry; publiczna klasa zapieczętowana Pozwala na kształtowanie com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • Zaproponowano drugą wersję zapoznawczą Vector API, która udostępnia 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 wersję zapoznawczą interfejsu API funkcji zagranicznych i pamięci, który umożliwia aplikacjom interakcję z kodem i danymi poza środowiskiem wykonawczym Java. Nowy interfejs API pozwala efektywnie wywoływać funkcje inne niż JVM i uzyskiwać dostęp do pamięci niezarządzanej przez JVM. 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.
  • Silnik renderujący macOS obsługujący interfejs API Java 2D, który z kolei obsługuje interfejs API Swing, został przystosowany do korzystania z interfejsu API grafiki Metal. Platforma macOS w dalszym ciągu domyślnie korzysta z OpenGL, a włączenie obsługi Metal wymaga ustawienia opcji „-Dsun.java2d.metal=true” i przynajmniej uruchomienia systemu macOS 10.14.x.
  • Dodano port dla platformy macOS/AArch64 (komputery Apple oparte na nowych chipach Apple M1). Cechą szczególną portu jest obsługa mechanizmu ochrony pamięci W^X (Write XOR Execute), w którym nie można jednocześnie uzyskać dostępu do stron pamięci w celu zapisu i wykonania. (kod może zostać wykonany dopiero po wyłączeniu zapisu, a zapis na stronę pamięci możliwy dopiero po wyłączeniu wykonania).
  • Powrócono do używania wyłącznie semantyki strictfp dla wyrażeń zmiennoprzecinkowych. Zaprzestano obsługi „domyślnej” semantyki, dostępnej od wydania Java 1.2, w tym uproszczeń do pracy na systemach z bardzo starymi koprocesorami matematycznymi x87 (po pojawieniu się instrukcji SSE2 zniknęła potrzeba dodatkowej semantyki).
  • Zaimplementowano nowe typy interfejsów do generatorów liczb pseudolosowych oraz zaimplementowano dodatkowe algorytmy w celu lepszego generowania liczb losowych. Aplikacje mają możliwość wyboru algorytmu generowania liczb pseudolosowych. Ulepszona obsługa generowania losowych strumieni obiektów.
  • Wymuszono ścisłą hermetyzację wszystkich elementów wewnętrznych JDK, z wyjątkiem krytycznych interfejsów API, takich jak sun.misc.Unsafe. Ścisła enkapsulacja blokuje próby uzyskania dostępu do wewnętrznych klas, metod i pól z poziomu kodu. Wcześniej tryb ścisłej enkapsulacji można było wyłączyć za pomocą opcji „--illegal-access=permit”, ale obecnie jest ona przestarzała. Aplikacje wymagające dostępu do wewnętrznych klas, metod i pól powinny jawnie je zdefiniować za pomocą opcji --add-opens lub atrybutu Add-Opens w pliku manifestu.
  • Aplikacje mają możliwość definiowania filtrów deserializacji danych, które mogą być zależne od kontekstu i dynamicznie wybierane na podstawie określonych operacji deserializacji. Określone filtry mają zastosowanie do całej maszyny wirtualnej (w całej JVM), tj. obejmują nie tylko samą aplikację, ale także biblioteki stron trzecich używane w aplikacji.
  • Swing dodał metodę javax.swing.filechooser.FileSystemView.getSystemIcon do ładowania dużych ikon w celu ulepszenia interfejsu użytkownika na ekranach o wysokiej rozdzielczości.
  • Interfejs API java.net.DatagramSocket zapewnia obsługę łączenia się z grupami multiemisji bez konieczności stosowania osobnego interfejsu API java.net.MulticastSocket.
  • Udoskonalono narzędzie IGV (Ideal Graph Visualizer), zapewniające interaktywną wizualizację pośredniej reprezentacji kodu w kompilatorze HotSpot VM C2 JIT.
  • W JavaDoc, analogicznie do kompilatora javac, gdy na wyjściu pojawia się błąd, wskazywany jest teraz numer problematycznej linii w pliku źródłowym i lokalizacja błędu.
  • Dodano właściwość native.encoding, odzwierciedlającą nazwę systemowego kodowania znaków (UTF-8, koi8-r, cp1251 itp.).
  • Dodano interfejs java.time.InstantSource, umożliwiający manipulowanie czasem bez odniesienia do strefy czasowej.
  • Dodano API java.util.HexFormat do konwersji na reprezentację szesnastkową i odwrotnie.
  • Do kompilatora dodano tryb czarnej dziury, który wyłącza operacje eliminacji martwego kodu, które można wykorzystać podczas przeprowadzania testów wydajnościowych.
  • Dodano opcję „-Xlog:async” do środowiska wykonawczego, aby rejestrować logi w trybie asynchronicznym.
  • Podczas nawiązywania bezpiecznych połączeń domyślnie włączony jest protokół TLS 1.3 (poprzednio używany był TLS 1.2).
  • Uznane wcześniej za przestarzałe Applet API (java.applet.Applet*, javax.swing.JApplet), które służyło do uruchamiania aplikacji Java w przeglądarce, zostało przeniesione do kategorii przeznaczonej do usunięcia (straciło na znaczeniu po zakończeniu wsparcia dla wtyczki Java dla przeglądarek).
  • Security Manager, który już dawno stracił na aktualności i okazał się nieodebrany po zakończeniu wsparcia dla wtyczki do przeglądarki, został przeniesiony do kategorii przeznaczonych do usunięcia.
  • Usunięto mechanizm aktywacji RMI, który jest przestarzały, zepchnięty do kategorii opcji w Javie 8 i prawie nigdy nie jest używany we współczesnej praktyce.
  • Eksperymentalny kompilator obsługujący JIT (just-in-time) do dynamicznej kompilacji kodu Java dla HotSpot JVM, a także tryb kompilacji wyprzedzającej (AOT, z wyprzedzeniem) klas do kodu maszynowego przed uruchomieniem maszyny wirtualnej , został usunięty z zestawu SDK. Kompilator został napisany w języku Java i bazuje na pracy projektu Graal. Należy zauważyć, że utrzymanie kompilatora wymaga dużo pracy, co nie jest uzasadnione, gdy nie ma zapotrzebowania ze strony programistów.

Źródło: opennet.ru

Dodaj komentarz