Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 23 (Java Platform, Standard Edition 23) veröffentlicht, wobei das OpenJDK-Projekt als Referenzimplementierung dient. Mit Ausnahme des Entfernens einiger veralteter Funktionen bleibt Java SE 23 vollständig rückwärtskompatibel mit früheren Versionen der Java-Plattform. Die meisten bereits entwickelten Java-Projekte werden ohne Änderungen unter der neuen Version weiterhin funktionieren. Installierbare Versionen von Java SE 22 (JDK, JRE und Server JRE) sind für Linux (x86_64, AArch64), Windows (x86_64) und macOS (x86_64, AArch64) verfügbar. Die im Rahmen des OpenJDK-Projekts entwickelte Referenzimplementierung von Java 23 ist vollständig unter der GPLv2-Lizenz mit Ausnahmen von GNU ClassPath geöffnet, die dynamisches Binden an kommerzielle Produkte ermöglichen.
Java SE 23 gehört zu den Versionen mit regulärer Unterstützung, wobei Updates bis zur nächsten Veröffentlichung bereitgestellt werden. Für Langzeitunterstützung (LTS) sollten Java SE 21 oder Java SE 17 verwendet werden, für die Updates bis 2031 bzw. 2029 herausgegeben werden (öffentlich bis 2028 und 2026). Die erweiterte Unterstützung der LTS-Version von Java SE 8 läuft bis 2030, für Java SE 11 bis 2032.
Zu den Neuerungen in Java SE 23 gehören:
- Der generative Modus des ZGC (Generational Z Garbage Collector) ist standardmäßig aktiviert. Dieser verwendet eine separate Verarbeitung von "alten" und "jungen" Objekten, was die Effizienz der Bereinigung von neu erstellten Objekten mit kurzer Lebensdauer erhöht. Die Anwendung des Generational ZGC verringert das Risiko von Pausen während der Ressourcenzuweisung, senkt die CPU-Belastung und den Speicherverbrauch bei der Müllabfuhr. Tests des Generational ZGC mit Apache Cassandra 4 zeigten eine vierfache Steigerung der Durchsatzrate bei fester Heap-Größe und eine Reduzierung der Heap-Größe um ein Viertel bei gleichbleibendem Durchsatz.
- JavaDoc hat nun Unterstützung für die Verwendung von Markdown zur Dokumentation von Code in Kommentaren hinzugefügt, die anstelle einer Mischung aus HTML und JavaDoc @-Tags verwendet werden kann.

- Die Musterabgleichmechanismen wurden um eine vorläufige Unterstützung für die Verwendung von primitiven Typen (int, byte, char und andere grundlegende Typen, die keine Objekte sind) in allen Arten von Vorlagen, im „instanceof“-Operator und in „switch“-Blöcken erweitert. switch (x.getStatus()) { case 0 -> „okay“; case 1 -> „warnung“; case 2 -> „fehler“; case int i -> „unbekannter Status: „ + i; } if (i instanceof byte b) { … b … }
- Es wurde eine vorläufige Unterstützung für die Verwendung einer einzigen Ausdrucksform „import module M“ hinzugefügt, um alle von dem angegebenen Modul exportierten Pakete gleichzeitig zu importieren. Diese Änderung vereinfacht die Wiederverwendung von Modulbibliotheken erheblich, da Bibliotheken und Klassen eingebunden werden können, ohne ihren Platz in der Paketstruktur anzugeben. Zum Beispiel führt die Angabe „import module java.base“ zum Import aller 54 Pakete, die im Modul java.base enthalten sind, die zuvor einzeln erwähnt werden mussten („import java.io.*“, „import java.util.*“ usw.).
Eine zweite vorläufige Implementierung der API Class-File wurde vorgeschlagen, um Dateien mit Java-Klassen zu analysieren, zu generieren und zu konvertieren. 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); } } });
- Eine achte vorläufige Implementierung der API Vector wurde vorgeschlagen, die Funktionen für vektorielle Berechnungen bereitstellt, die mit vektoriellen Instruktionen der Prozessoren x86_64 und AArch64 durchgeführt werden und gleichzeitig Operationen auf mehreren Werten anwenden können (SIMD). Im Gegensatz zu den Automatisierungsfunktionen des JIT-Compilers HotSpot für skalare Operationen ermöglicht die neue API eine explizite Verwaltung der Vektorisierung für die parallele Datenverarbeitung.
- In die Klasse java.io.Console wurden die Methoden format, printf, readPassword und readLine eingefügt, um Texte formatgerecht auszugeben und unter Berücksichtigung der gewählten Locale zu lesen. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 jeudi
- Eine zweite vorläufige Version der erweiterten Stream-API wurde hinzugefügt, die die Definition eigener Zwischenoperationen unterstützt, die in Fällen nützlich sein können, in denen die vorhandenen integrierten Zwischenoperationen für die gewünschte Datenumwandlung nicht ausreichen. Eigene Handler werden über die neue Zwischenoperation Stream::gather(Gatherer) angeschlossen, die die Stream-Elemente verarbeitet, indem sie den vom Benutzer angegebenen Handler anwendet. 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]]
- Eine dritte vorläufige Version von implizit deklarierten Klassen und anonymen Instanzen der Methode „main“ wurde hinzugefügt, in der es keine Deklarationen von public/static, keine Übergabe von Argumentarrays und keine weiteren mit der Klassendeklaration verbundenen Entitäten benötigt werden. // war public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // jetzt kann void main() { System.out.println("Hello, World!"); }
- Eine zweite vorläufige Möglichkeit wurde hinzugefügt, die es ermöglicht, in Ausdruckskonstruktoren vor dem Aufruf von super(...) zu definieren, der verwendet wird, um den Konstruktor der Elternklasse explizit aus dem Konstruktor der abgeleiteten Klasse aufzurufen, solange diese Ausdrücke nicht auf die durch den Konstruktor erzeugte Instanz verweisen. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Eine dritte vorläufige Implementierung von Scoped Values wurde hinzugefügt, die das gemeinsame Nutzen von unveränderlichen Daten in Threads ermöglicht und den effektiven Datenaustausch zwischen untergeordneten Threads (Werte werden vererbt) unterstützt. Scoped Values entwickeln sich als Ersatz für den Mechanismus der thread-lokalen Variablen und sind effizienter bei der Nutzung einer sehr großen Anzahl virtueller Threads (Tausende und Millionen von Threads). Der Hauptunterschied zwischen Scoped Values und thread-lokalen Variablen besteht darin, dass erstere einmal geschrieben werden, anschließend nicht mehr verändert werden können und nur zur Laufzeit des Threads verfügbar bleiben.
- Die dritte Vorabversion der API für strukturierten Parallelismus (Structured Concurrency) wurde zur Testung vorgeschlagen. Diese vereinfacht die Entwicklung von Multithread-Anwendungen, indem sie mehrere Aufgaben, die in verschiedenen Threads ausgeführt werden, als einen einzigen Block verarbeitet.
- Die Zugriffsmethoden auf externen Speicher (außerhalb der JVM), die von der Klasse sun.misc.Unsafe bereitgestellt werden, wurden als veraltet erklärt und sind zur Entfernung vorgesehen. Für den Zugriff auf außerhalb des Heaps (off-heap) gespeicherte Daten und die Interaktion mit externem Code wird empfohlen, die APIs VarHandle und FFM (Foreign Function & Memory) zu verwenden.
Zusätzlich wurde das Update der Plattform für die Entwicklung von Anwendungen mit der grafischen Benutzeroberfläche JavaFX 23 veröffentlicht und der GraalVM JIT-Compiler in die Oracle JDK 23 integriert.
Es wurde auch eine neue Version der universellen virtuellen Maschine GraalVM vorgestellt, die die Ausführung von Anwendungen in JavaScript (Node.js), Python, Ruby, R sowie in allen JVM-Sprachen (Java, Scala, Clojure, Kotlin) und in Sprachen, für die LLVM-Bitcode generiert werden kann (C, C++, Rust), unterstützt. Neben der Unterstützung von JDK 23 wurden in der neuen Version der Speicherverbrauch und die Größe des ausführbaren Codes optimiert sowie die vollständige Unterstützung für die Integration von Python und WebAssembly in Java-Code unter Verwendung von JIT-Compilation implementiert.
Quelle: opennet.ru

