Выпуск 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

Дадаць каментар