Издаване на Java SE 17

След шест месеца разработка, компанията 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster