Po šesti měsících vývoje společnost Oracle zveřejnila platformu Java SE 23 (Java Platform, Standard Edition 23), jejíž referenční implementací je otevřený projekt OpenJDK. S výjimkou odstranění některých zastaralých funkcí v Java SE 23 byla zachována zpětná kompatibilita s předchozími verzemi platformy Java — většina dříve napsaných Java projektů bude fungovat bez změn na nové verzi. Připravené instalační balíčky Java SE 22 (JDK, JRE a Server JRE) jsou dostupné pro Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenční implementace Java 23 vyvinutá v rámci projektu OpenJDK je plně otevřená pod licencí GPLv2 s výjimkami GNU ClassPath, které umožňují dynamické spojení s komerčními produkty.
Java SE 23 je zařazena do kategorie verzí s běžnou podporou, aktualizace pro ni budou vydávány až do příští verze. Pro dlouhodobou podporu (LTS) by se měly používat Java SE 21 nebo Java SE 17, pro které budou aktualizace poskytovány do let 2031 a 2029 (veřejně dostupné do let 2028 a 2026). Rozšířená podpora LTS větve Java SE 8 potrvá do roku 2030, zatímco Java SE 11 do roku 2032.
Mezi novinkami v Java SE 23 patří:
- Ve výchozím nastavení je zahrnuta generativní móda práce s garbage collectorem ZGC (Generational Z Garbage Collector), který používá oddělené zpracování "starých" a "mladých" objektů, což zvyšuje efektivitu čištění nedávno vytvořených objektů s krátkou životností. Použití Generational ZGC snižuje rizika pozastavení během alokace zdrojů, snižuje zátěž CPU a spotřebu paměti při sběru odpadu. Testování Generational ZGC s Apache Cassandra 4 ukázalo čtyřnásobné zvýšení propustnosti při pevném velikosti haldy (heap) a snížení velikosti haldy o čtvrtinu při nezměněné propustnosti.
- Do JavaDoc byla přidána podpora pro použití formátování Markdown pro dokumentaci kódu v komentářích, které lze používat místo směsi HTML a anotací JavaDoc.

- Mechanism pro porovnávání vzorů byl rozšířen o předběžnou podporu primitivních typů (int, byte, char a další základní typy, které nejsou objekty) ve všech typech šablon, v operátoru „instanceof“ a v bloku „switch“. switch (x.getStatus()) { case 0 -> „okay“; case 1 -> „warning“; case 2 -> „error“; case int i -> „unknown status: “ + i; } if (i instanceof byte b) { … b … }
- Byla přidána předběžná podpora pro použití jednoho výrazu „import module M“ pro import všech balíčků exportovaných zadaným modulem. Tato změna značně zjednodušuje opětovné použití modulových knihoven, což umožňuje připojit knihovny a třídy bez určení jejich místa v hierarchii balíčků. Například uvedení „import module java.base“ povede k importu všech 54 balíčků, které jsou součástí modulu java.base, které by bylo dříve nutné zmiňovat jednotlivě („import java.io.*“, „import java.util.*“ atd.).
Byla navržena druhá předběžná realizace API Class-File pro analýzu, generaci a transformaci souborů s třídami Java. 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); } } });
- Byla navržena osmá předběžná realizace API Vector, která poskytuje funkce pro vektorové výpočty, jež se provádějí s využitím vektorových instrukcí procesorů x86_64 a AArch64 a umožňují současně aplikovat operace na více hodnot (SIMD). Na rozdíl od automatizace vektorování skalárních operací poskytovaných JIT kompilátorem HotSpot dává nové API možnost explicitně řídit vektorování pro paralelní zpracování dat.
- Do třídy java.io.Console byly přidány metody format, printf, readPassword a readLine pro formátování, výstup a čtení textu s ohledem na zvolenou lokalitu. System.console().printf(Locale.FRANCE, „%1$tY-%1$tB-%1$te %1$tA“, new Date()) 2024-mai-16 jeudi
- Byla přidána druhá předběžná implementace rozšířeného API Stream, které podporuje definici vlastních mezistupňových operací, které se mohou hodit ve případech, kdy existující vestavěné mezistupňové operace nejsou dostatečné pro požadovanou transformaci dat. Vlastní zpracovatele se připojují pomocí nové mezistupňové operace Stream::gather(Gatherer), která zpracovává prvky proudu a aplikovanou uživatelskou zpracovatel. 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]]
- Byla přidána třetí předběžná implementace implicitně deklarovaných tříd a anonymních instancí metody „main“, ve kterých se obejdeme bez deklarací public/static, předávání pole argumentů a dalších entit souvisejících s deklarací třídy. // bylo public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nyní lze void main() { System.out.println("Ahoj, světe!"); }
- Byla přidána druhá předběžná možnost, která umožňuje specifikaci výrazů v konstruktorech před voláním super(…), používaného pro explicitní volání konstruktoru rodičovské třídy z konstruktoru děděné třídy, pokud se tyto výrazy neodkazují na instance vytvářené konstruktorem. class Outer { void hello() { System.out.println("Ahoj"); } class Inner { Inner() { hello(); super(); } } }
- Byla přidána třetí předběžná realizace omezených hodnot (Scoped Values), které umožňují sdílet neměnné údaje v proudech a efektivně vyměňovat údaje mezi podřízenými proudy (hodnoty jsou děděny). Scoped Values se vyvíjejí jako náhrada za mechanismus proměnných lokálních k vláknu (thread-local variables) a jsou efektivnější při použití velmi velkého počtu virtuálních vláken (tisíce a miliony vláken). Hlavní rozdíl mezi Scoped Values a proměnnými lokálními k vláknu je v tom, že první se zapisují jednou, později nemohou být měněny a zůstávají dostupné pouze po dobu běhu vlákna.
- Byl navržen třetí předběžný variant API pro strukturovaný paralelismus, který zjednodušuje vývoj vícetréninkových aplikací díky zpracování několika úloh vykonávaných v různých vláknech jako jednotného bloku.
- Metody přístupu k externí paměti (mimo JVM), poskytované třídou sun.misc.Unsafe, byly vyhlášeny za zastaralé a plánují se k odstranění. Pro přístup k paměti mimo haldu a interakci s externím kódem se doporučuje používat API VarHandle a API FFM (Foreign Function & Memory).
Dále lze zmínit vydání aktualizace platformy pro vytváření aplikací s grafickým rozhraním JavaFX 23 a zahrnutí JIT-kompilátoru GraalVM do hlavní sestavy Oracle JDK 23.
Bylo také představeno nové vydání univerzální virtuální stroje GraalVM, podporující provoz aplikací v JavaScriptu (Node.js), Pythonu, Rubym, R, jakýchkoli jazycích pro JVM (Java, Scala, Clojure, Kotlin) a jazycích, pro které může být generován bitový kód LLVM (C, C++, Rust). Kromě podpory JDK 23 byla v nové verzi optimalizována spotřeba paměti a velikost spustitelného kódu, a byla zavedena plná podpora prostředků pro vkládání Pythonu a WebAssembly do Java kódu s použitím JIT-kompilace.
Zdroj: opennet.ru

