Po šiestich mesiacoch vývoja spoločnosť Oracle vydala platformu Java SE 17 (Java Platform, Standard Edition 17), pričom ako referenčná implementácia sa používa otvorený projekt OpenJDK. S výnimkou odstránenia niektorých zastaraných funkcií je v Java SE 17 zachovaná spätná kompatibilita s predchádzajúcimi vydaniami platformy Java — väčšina predtým naprogramovaných Java projektov bude bez zmien fungovať na novej verzii. Inštalovateľné zostavy Java SE 17 (JDK, JRE a Server JRE) sú pripravené pre Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenčná implementácia Java 17, vyvinutá v rámci projektu OpenJDK, je plne otvorená pod licenciou GPLv2 s výnimkami GNU ClassPath, ktoré umožňujú dynamické prepojenie s komerčnými produktmi.
Java SE 17 patrí do kategórie vydaní s dlhodobou podporou (LTS), aktualizácie pre ktoré budú vydávané do roku 2029. Vydávanie aktualizácií pre predchádzajúcu medzi-verziu Java 16 bolo zastavené. Predchádzajúca LTS vetva Java 11 bude podporovaná do roku 2026. Ďalšie LTS vydanie je naplánované na september 2024. Pripomíname, že od vydania Java 10 projekt prešiel na nový proces vývoja, ktorý predpokladá kratší cyklus vzniku nových vydaní. Nové funkcie sa teraz vyvíjajú v jednej neustále aktualizovanej master vetve, do ktorej sú zahrnuté už hotové zmeny a od ktorej sa každých šesť mesiacov odvetvujú vetvy na stabilizáciu nových vydaní.
Medzi novinky Java 17 patrí:
- Bola navrhnutá experimentálna implementácia vzorového porovnávania v príkazoch „switch“, ktorá umožňuje v označeniach „case“ používať nie presné hodnoty, ale flexibilné vzory pokrývajúce celý rad hodnôt, pre ktoré sa predtým museli používať rozsiahlé reťazce príkazov „if…else“. Okrem toho je vo vnútri „switch“ zabezpečená možnosť spracovania hodnôt 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(); };
- Zavedená podpora pre uzavreté ('sealed') triedy a rozhrania, ktoré môžu byť používané inými triedami a rozhraniami len na dedenie, rozšírenie alebo prepísanie implementácie. Uzavreté triedy tiež poskytujú deklaratívnejší spôsob, ako obmedziť používanie nadtriedy, než modifikátory prístupu, ktoré sa zakladajú na explicitnom vymenovaní podtried povolených na rozšírenie. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
- Navrhnutá druhá predbežná implementácia API Vector, ktorá poskytuje funkcie pre vektorové výpočty, ktoré sa vykonávajú pomocou vektorových inštrukcií procesorov x86_64 a AArch64, a umožňujú súčasne aplikovať operácie na viacerých hodnotách (SIMD). Na rozdiel od funkcií, ktoré poskytuje JIT-kompiler HotSpot pre automatickú vektorizáciu skalárnych operácií, nové API umožňuje explicitne riadiť vektorizáciu pre paralelné spracovanie údajov.
- Pridaná predbežná implementácia API Foreign Function & Memory, pomocou ktorého môžu aplikácie interagovať s kódom a dátami nachádzajúcimi sa mimo Java runtime. Nové API umožňuje efektívne volať funkcie, ktoré neprebiehajú v JVM, a pristupovať k pamäte, ktorú JVM neovláda. Napríklad, je možné volať funkcie z externých zdieľaných knižníc a pristupovať k údajom procesu bez použitia JNI.
- Renderovací engine pre macOS, ktorý zabezpečuje fungovanie API Java 2D, ktoré je zase zapojené do API Swing, bol prispôsobený na použitie grafického API Metal. Predvolený na platforme macOS naďalej používa OpenGL, a na aktiváciu podpory Metal je potrebné nastaviť parameter '-Dsun.java2d.metal=true' a mať minimálne verziu macOS 10.14.x.
- Pridaný port pre platformu macOS/AArch64 (počítače Apple s novými čipmi Apple M1). Charakteristikou portu je podpora mechanizmu ochrany pamäte W^X (Write XOR Execute), pri ktorom nemôžu byť stránky pamäte súčasne prístupné na zápis a vykonávanie. (kód môže byť vykonaný len po zakázaní zápisu, a zápis do stránky pamäte je možný len po zákaze vykonávania).
- Vratené použitie výhradne prísnej (strictfp) sémantiky pre výrazy s pohyblivou desatinnou čiarkou. Podpora sémantiky "default", dostupná od vydania Java 1.2, bola zastavená, vrátane zjednodušení pre prácu na systémoch s veľmi starými matematickými koprocesormi x87 (po zavedení inštrukcií SSE2 potrebnosť voľnej sémantiky zanikla).
- Implementované nové typy rozhraní pre generátory pseudo-náhodných čísel, ako aj ďalšie algoritmy pre kvalitnejšiu generáciu náhodných čísel. Aplikáciám bola poskytnutá možnosť výberu algoritmu generovania pseudo-náhodných čísel. Zlepšená podpora generovania tokov náhodných objektov.
- Implementovaná povinná prísna enkapsulácia všetkých vnútorných prvkov JDK, okrem kritických API, ako je sun.misc.Unsafe. Prísna enkapsulácia blokuje pokusy o prístup z kódu k vnútorným triedam, metódam a poľom. Predtým sa režim prísnej enkapsulácie dal vypnúť pomocou voľby "—illegal-access=permit", ale teraz je vyhlásená za zastaranú. Pre aplikácie, ktoré vyžadujú prístup k vnútorným triedam, metódam a poľom, je potrebné ich explicitne definovať pomocou voľby "—add-opens" alebo atribútu Add-Opens v manifestovom súbore.
- Aplikáciám bola poskytnutá možnosť definovať filtre pre deserializáciu údajov, ktoré môžu závisieť od kontextu a vyberať sa dynamicky v súvislosti s určitými operáciami deserializácie. Nastavené filtre sú použiteľné v rámci celej virtuálnom stroji (JVM-wide), t.j. pokrývajú nielen samotnú aplikáciu, ale aj používané v aplikácii externé knižnice.
- V Swing bol pridaný metóda javax.swing.filechooser.FileSystemView.getSystemIcon na načítanie ikon vo veľkom rozlíšení, čo umožňuje zlepšiť tvarovanie rozhrania na obrazovkách s vysokou hustotou pixelov (HighDPI).
- V API java.net.DatagramSocket bola implementovaná podpora pripojenia k skupinám Multicast bez nutnosti použitia samostatného API java.net.MulticastSocket.
- Vylepšená utilita IGV (Ideal Graph Visualizer), poskytujúca interaktívnu vizualizáciu medziobrázkového zastúpenia kódu v JIT kompilátore HotSpot VM C2.
- V JavaDoc, podobne ako pri kompilátore javac, sa pri výstupe chyby teraz uvádza číslo problematického riadku v zdrojovom súbore a miesto chyby.
- Pridaná vlastnosť native.encoding, ktorá odráža názov systémovej znakovej sady (UTF-8, koi8-r, cp1251 atď.).
- Pridané rozhranie java.time.InstantSource, ktoré umožňuje manipulovať s časom bez viazania na časové pásmo.
- Pridané API java.util.HexFormat na prevod do hexadecimálneho formátu a späť.
- V kompilátore bol pridaný režim blackhole, ktorý vypína operácie výnimiek nepoužívaného kódu (eliminácia mŕtveho kódu), čo môže byť využité pri testovaní výkonu.
- Do Runtime bola pridaná možnosť „-Xlog:async“ na zapisovanie logov v asynchrónnom režime.
- Pri nastavovaní zabezpečených spojení je predvolený TLS 1.3 (predtým bol používaný TLS 1.2).
- Preložené do kategórie plánovaných na odstránenie predtým vyhlásený zastaraný API Applet (java.applet.Applet*, javax.swing.JApplet), ktorý sa používal na spúšťanie Java aplikácií v prehliadači (stratil relevanciu po ukončení podpory Java pluginu pre prehliadače).
- Preložené do kategórie plánovaných na odstránenie Security Manager, ktorý sa už dlho stal zastaraným a nie je žiadaný po ukončení podpory prehliadačového pluginu.
- Odstránený mechanizmus RMI Activation, ktorý zastaral, bol prevedený na voliteľnú funkciu už v Java 8 a takmer sa už v súčasnej praxi nepoužíva.
- Z SDK bol odstránený experimentálny kompilátor podporujúci JIT (just-in-time) pre dynamickú kompiláciu Java kódu pre HotSpot JVM, ako aj režim predkompilácie (AOT, ahead-of-time) tried do strojového kódu pred spustením virtuálnej machine. Kompilátor bol napísaný v Jave a založený na výsledkoch projektu Graal. Uvádza sa, že údržba kompilátora si vyžaduje vysoké pracovné náklady, ktoré sa v podmienkach nízkej požiadavky u vývojárov neospravedlňujú.
Zdroj: opennet.ru
