Випуск 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 проект перейшов на новий процес розробки, який передбачає більш короткий цикл формування нових релізів. Нова функціональність тепер розвивається в одній master-гілці, що постійно оновлюється, в яку включаються вже готові зміни і від якої раз на шість місяців відгалужуються гілки для стабілізації нових випусків.

З нововведень 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) семантики для виразів із плаваючою комою. Припинено підтримку доступної починаючи з випуску Java 1.2 семантики «default», що включає спрощення для роботи на системах з дуже старими математичними співпроцесорами 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

Додати коментар або відгук