Po šiestich mesiacoch vývoja spoločnosť Oracle vydala platformu Java SE 23 (Java Platform, Standard Edition 23), pričom ako referenčná realizácia sa používa otvorený projekt OpenJDK. Okrem odstránenia niektorých zastaraných funkcií v Java SE 23 zostala zachovaná spätná kompatibilita s predchádzajúcimi verziami platformy Java — väčšina predtým napísaných Java projektov bude fungovať bez zmien pri spustení s novou verziou. Hotové inštalačné zostavy Java SE 22 (JDK, JRE a Server JRE) sú pripravené pre Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenčná realizácia Java 23, vyvinutá v rámci projektu OpenJDK, je úplne otvorená pod licenciou GPLv2 s výnimkami GNU ClassPath, ktoré povoľujú dynamické prepojenie s komerčnými produktmi.
Java SE 23 je zaradená do kategórie vydaní so štandardnou dobou podpory, aktualizácie budú vydávané do nasledujúceho vydania. Ako vetvu s dlhodobou podporou (LTS) by ste mali použiť Java SE 21 alebo Java SE 17, pre ktoré budú vydávané aktualizácie do rokov 2031 a 2029 (verejné - do rokov 2028 a 2026). Rozšírená podpora LTS vetvy Java SE 8 potrvá do roku 2030, zatiaľ čo Java SE 11 do roku 2032.
Medzi novinkami v Java SE 23 nájdete:
- Predvolený generatívny režim práce garbage collectora ZGC (Generational Z Garbage Collector) využíva oddelené spracovanie „starých“ a „mladých“ objektov, čo zvyšuje účinnosť čistenia novovytvorených objektov s krátkou životnosťou. Použitie Generational ZGC znižuje riziko prerušenia počas pridelenia zdrojov, znižuje záťaž CPU a spotrebu pamäte počas likvidácie odpadu. Testovanie Generational ZGC s Apache Cassandra 4 ukázalo štvornásobné zvýšenie priepustnosti pri pevnej veľkosti haldy (heap) a zníženie veľkosti haldy o štvrtinu pri nezmenenej priepustnosti.
- Do JavaDoc bola pridaná podpora pre použitie Markdown rozšírenia na dokumentovanie kódu v komentároch, ktoré je možné použiť namiesto zmesi HTML a @-tagov JavaDoc.

- Mechanizmy porovnávania rozšírené o predbežnú podporu pre použitie primitivných typov (int, byte, char a iné základné typy, ktoré nie sú objektmi) vo všetkých typoch šablón, v operátore „instanceof“ a v blokoch „switch“. switch (x.getStatus()) { case 0 -> „okay“; case 1 -> „warning“; case 2 -> „error“; case int i -> „neznámy stav: „ + i; } if (i instanceof byte b) { … b … }
- Pridaná predbežná podpora pre použitie jedného výrazu „import module M“ na importovanie všetkých balíkov exportovaných daným modulom. Táto zmena výrazne zjednodušuje opätovné využitie modulových knižníc, pričom umožňuje pripojenie knižníc a tried bez nutnosti určiť ich miesto v hierarchii balíkov. Napríklad, uvedenie „import module java.base“ spôsobí import všetkých 54 balíkov, ktoré sú súčasťou modulu java.base, ktoré by sa predtým museli uvádzať individuálne („import java.io.*“, „import java.util.*“ a pod.).
Navrhnutá druhá predbežná implementácia API Class-File na analýzu, generovanie a transformáciu súborov s Java triedami. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith(„debug“))) { classBuilder.with(ce); } } });
- Navrhnutá ôsma 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 viacero hodnôt (SIMD). Na rozdiel od funkcií automatizovanej vektorizácie skalarových operácií poskytovaných JIT kompilátorom HotSpot, nové API umožňuje explicitne riadiť vektorizáciu pre paralelné spracovanie dát.
- Do triedy java.io.Console boli pridané metódy format, printf, readPassword a readLine pre formátovanie, výstup a čítanie textu s ohľadom na vybranú lokalitu. System.console().printf(Locale.FRANCE, „%1$tY-%1$tB-%1$te %1$tA“, new Date()) 2024-mai-16 jeudi
- Pridaná druhá predbežná implementácia rozšíreného API Stream, ktorá podporuje definovanie vlastných medzioperácií, ktoré môžu byť užitočné v prípadoch, keď existujúcich vstavaných medzioperácií je nedostatok pre požadovanú transformáciu údajov. Vlastné spracovatelia sa pripájajú pomocou novej medzioperácie Stream::gather(Gatherer), ktorá spracováva prvky prúdu s použitím zadaného užívateľského spracovateľa. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 == [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Pridaná tretia predbežná implementácia neexplicitne deklarovaných tried a anonymných inštancií metódy „main“, v ktorých je možné obísť deklarácie public/static, prenášanie poľa argumentov a iné entity spojené s deklaráciou triedy. // bolo public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // teraz je možné void main() { System.out.println("Ahoj, svet!"); }
- Pridaná druhá predbežná varianta funkcie, ktorá umožňuje špecifikáciu výrazov v konštruktoroch pred volaním super(...), slúžiacich na explicitné volanie konštruktora rodičovskej triedy z konštruktora dedenej triedy, pokiaľ sa tieto výrazy neodkazujú na inštanciu vytvorenú konštruktorom. class Outer { void hello() { System.out.println("Ahoj"); } class Inner { Inner() { hello(); super(); } } }
- Pridaná tretia predbežná implementácia obmedzených hodnôt (Scoped Values), ktorá umožňuje zdieľať nemenné údaje v prúdoch a efektívne vymieňať dáta medzi podriadenými prúdmi (hodnoty sa dedičia). Scoped Values sa vyvíjajú ako náhrada za mechanizmus premenných lokálnych k prúdu (thread-local variables) a sú efektívnejšie pri použití veľmi veľkého počtu virtuálnych prúdov (tisíce a milióny prúdov). Hlavný rozdiel medzi Scoped Values a premennými lokálnymi k prúdu je v tom, že prvé sa zapisujú raz, ďalej nemôžu byť menené a zostávajú dostupné len počas vykonávania prúdu.
- Predložený na testovanie tretí predbežný variant API pre štruktúrovaný paralelizmus (Structured Concurrency), ktorý zjednodušuje vývoj viackoľových aplikácií spracovaním viacerých úloh vykonávaných v rôznych vláknach ako jedného bloku.
- Metódy prístupu k externému pamäťovému priestoru (mimo JVM), ktoré poskytuje trieda sun.misc.Unsafe, sú vyhlásené za zastarané a plánuje sa ich odstránenie. Na prístup k pamäti mimo haldy (off-heap) a interakciu s externým kódom sa odporúča používať API VarHandle a API FFM (Foreign Function & Memory).
Ďalšie poznámky zahŕňajú publikáciu aktualizácie platformy pre vytváranie aplikácií s grafickým rozhraním JavaFX 23 a zaradenie JIT kompilátora GraalVM do základného zloženia Oracle JDK 23.
Taktiež bol predstavený nový výstup univerzálnej virtuálnej mašiny GraalVM, ktorá podporuje spúšťanie aplikácií v JavaScripte (Node.js), Pythone, Rubyn, R, akýchkoľvek jazykov pre JVM (Java, Scala, Clojure, Kotlin) a jazykov, pre ktoré môže byť vytvorený bitkód LLVM (C, C++, Rust). Okrem podpory JDK 23 bola v novej verzii optimalizovaná spotreba pamäte a veľkosť spustiteľného kódu, implementovaná plná podpora nástrojov na vkladanie Pythonu a WebAssembly do Java kódu pomocou JIT kompilácie.
Zdroj: opennet.ru

