След шест месеца разработка, компанията Oracle пусна платформата Java SE 17 (Java Platform, Standard Edition 17), като еталонна реализация на която се използва отвореният проект OpenJDK. С изключение на премахването на някои остарели функции в Java SE 17, е запазена обратната съвместимост с предишни версии на платформата Java – повечето от предишно написаните Java проекти ще работят без промени с новата версия. Готовите за инсталиране версии на Java SE 17 (JDK, JRE и Server JRE) са подготвени за Linux (x86_64, AArch64), Windows (x86_64) и macOS (x86_64, AArch64). Разработената в рамките на проекта OpenJDK еталонна реализация на Java 17 е напълно отворена под лицензия GPLv2 с изключения на GNU ClassPath, позволяващи динамично свързване с търговски продукти.
Java SE 17 попада в категорията на изданията с дългосрочна поддръжка (LTS), като обновления ще бъдат пускани до 2029 година. Подкрепата за предишния междинен релиз Java 16 е прекратена. Предишната LTS версия Java 11 ще бъде поддържана до 2026 година. Следващият LTS релиз е планиран за септември 2024 година. Напомняме, че от изданието Java 10 проектът премина на нов процес на разработка, който предполага по-кратки цикли за създаване на нови версии. Новите функционалности сега се развиват в една постоянно актуализирана основна клонка, в която се включват готови промени и от която на всеки шест месеца се отклоняват клонове за стабилизиране на новите издания.
От нововъведенията в Java 17 могат да бъдат отбелязани:
- Предложена е експериментална реализация на шаблонно съвпадение в изразите "switch", позволяваща в етикетите "case" да се използват не точни стойности, а гъвкави шаблони, обхващащи серия стойности, за които по-рано се налагаше да се използват обемисти вериги от изрази "if...else". Освен това вътре в "switch" е осигурена възможност за обработка на стойности NULL. Object o = 123L; String formatted = 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(); };
- Стабилизирана е поддръжката на запечатани („sealed“) класове и интерфейси, които не могат да се използват от други класове и интерфейси за наследяване, разширяване или пренаписване на реализацията. Запечатаните класове също така предоставят по-декларативен начин за ограничаване на използването на суперклас, отколкото модификаторите за достъп, базирани на явно посочване на подкласовете, разрешени за разширение. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
- Предложена е втора предварителна реализация на API Vector, предоставяща функции за векторни изчисления, които се изпълняват с използването на векторни инструкции на процесорите x86_64 и AArch64 и позволяват едновременно прилагане на операции към няколко стойности (SIMD). В отличие от функциите за автоматична векторизация на скаларни операции, предоставяни от JIT компилатора HotSpot, новият API дава възможност за явно управление на векторизацията за паралелна обработка на данни.
- Добавена е предварителна реализация на API Foreign Function & Memory, с помощта на който приложенията могат да взаимодействат с код и данни, разположени извън Java runtime. Новият API позволява ефективно извикване на функции, изпълнявани не в JVM, и достъп до памет, не управлявана от JVM. Например, може да се извикват функции от външни споделени библиотеки и да се достъпват данни от процеса без използване на JNI.
- Двигателят за рендериране за macOS, осигуряващ работа на API Java 2D, който от своя страна е задействан в API Swing, е адаптиран за използване на графичния API Metal. По подразбиране на платформата macOS все още се прилага OpenGL, а за включване на поддръжка за Metal е необходимо да се зададе параметърът „-Dsun.java2d.metal=true“ и да се има поне версия на macOS 10.14.x.
- Добавен е порт за платформата macOS/AArch64 (компютри Apple с новите чипове Apple M1). Особеност на порта е поддръжката на механизма за защита на паметта W^X (Write XOR Execute), при който страниците на паметта не могат да бъдат достъпни едновременно за запис и изпълнение. (кода може да се изпълнява само след забрана на запис, а запис в страницата на паметта е възможен само след забрана на изпълнението).
- Върнато е използването само на строго (strictfp) семантика за изрази с плаваща запетая. Подкрепата за наличната семантика „default“, започваща от версия Java 1.2, която включваше опростявания за работа на системи с много стари математически копроцесори x87 (след появата на инструкциите SSE2 необходимостта от допълнителна семантика отпадна), е прекратена.
- Реализирани са нови типове интерфейси към генератори на псевдослучайни числа, както и са внедрени допълнителни алгоритми за по-качествена генерация на случайни числа. Приложенията получиха възможност да избират алгоритъма за генерация на псевдослучайни числа. Подобрена е поддръжката на генерирането на потоци от случайни обекти.
- Реализирана е задължителна строга инкапсулация на всички вътрешни елементи на JDK, освен критичните API, като sun.misc.Unsafe. Строгата инкапсулация блокира опити за достъп от код до вътрешни класове, методи и полета. Преди режимът на строга инкапсулация можеше да бъде изключван чрез опцията „—illegal-access=permit“, но сега тя е обявена за остаряла. За приложения, които имат нужда от достъп до вътрешни класове, методи и полета, трябва да бъдат явно определени чрез опцията „—add-opens“ или атрибута Add-Opens в манифест файла.
- На приложенията е предоставена възможност да определят филтри за десериализация на данни, които могат да зависят от контекста и да се избират динамично в зависимост от определени операции по десериализация. Определените филтри са приложими за цялата виртуална машина (JVM-wide), т.е. обхващат не само самото приложение, но и използваните в приложението трети библиотеки.
- В Swing е добавен метод javax.swing.filechooser.FileSystemView.getSystemIcon за зареждане на пиктограми с голям размер, който позволява подобряване на оформлението на интерфейса на екрани с висока плътност на пиксели (HighDPI).
- В API java.net.DatagramSocket е реализирана поддръжка за свързване към групи Multicast без необходимост от използването на отделно API java.net.MulticastSocket.
- Подобрена е утилитата IGV (Ideal Graph Visualizer), която осигурява интерактивна визуализация на междинното представяне на кода в JIT компилатора HotSpot VM C2.
- В JavaDoc, подобно на компилатора javac, при извеждане на грешка сега се посочва номерът на проблемния ред в изходния файл и мястото на грешката.
- Добавено свойство native.encoding, отразяващо името на системната кодировка на символи (UTF-8, koi8-r, сp1251 и т.н.).
- Добавен е интерфейс java.time.InstantSource, който позволява манипулиране с времето без привързване към часовата зона.
- Добавен е API java.util.HexFormat за преобразуване в шестнадесетично представяне и обратно.
- В компилатора е добавен режим blackhole, който изключва операциите за изключаване на неизползван код (dead-code elimination), което може да се използва при провеждане на тестове за производителност.
- В Runtime е добавена опция „-Xlog:async“ за записване на логове в асинхронен режим.
- При установяване на защитени връзки по подразбиране е активиран TLS 1.3 (по-рано се използваше TLS 1.2).
- Преведен в категория на предстоящи за премахване е вече обявеният за остарял API Applet (java.applet.Applet*, javax.swing.JApplet), използван за стартиране на Java приложения в браузъра (потърпя загуба на актуалност след прекратяване на поддръжката на Java приставката за браузъри).
- Преведен в категория на предстоящи за премахване е Security Manager, който отдавна е загубил актуалността си и е останал ненужен след прекратяване на поддръжката на браузърната приставка.
- Премахнат е механизмът RMI Activation, който стана остарял, беше преведен в опция още с Java 8 и рядко се използва в съвременната практика.
- От SDK е премахнат експериментален компилатор, поддържащ JIT (just-in-time) за динамична компилация на Java код за HotSpot JVM, а също така режим за предварителна компилация (AOT, ahead-of-time) на класове в машинен код преди стартиране на виртуалната машина. Компилаторът е написан на Java и е основан на разработки от проекта Graal. Отбелязва се, че поддържането на компилатора изисква значителни трудозатрати, които не се оправдават в условията на ненужност от страна на разработчиците.
Източник: opennet.ru
