Java 22 reduziert Boilerplate Code und stabilisiert Anbindung an C++ und Co.

Neben Ergänzungen im Project Loom bringt das neue JDK Funktionen für eine knappere Syntax, String Templates und das bessere Zusammenspiel mit anderen Sprachen.

In Pocket speichern vorlesen Druckansicht 30 Kommentare lesen
Stilisierter Computer mit einer Kaffeetasse

(Bild: Erzeugt mit Midjourney durch heise medienwerk)

Lesezeit: 10 Min.
Inhaltsverzeichnis

Im turnusmäßigen Sechsmonatstakt ist das OpenJDK 22 erschienen. Das Release kann zwar nicht mit den Neuerungen des Vorgängers mithalten, bringt es aber auf zwölf Java Enhancement Proposals (JEP).

Viele Ergänzungen sind noch als Preview gekennzeichnet. Einige von ihnen knüpfen am OpenJDK 21 an, darunter Structured Concurrency und String Templates, die jeweils in die zweite Preview-Runde gehen. Außerdem gibt es einige neue Vorschaufunktionen wie die Class-File-API und Stream Gatherers.

Das OpenJDK 22 bringt insgesamt zwölf JEPs mit.

(Bild: Oracle)

Der Vorgänger stach allerdings nicht nur wegen insgesamt 15 JEPs hervor, sondern auch, weil viele Anbieter es mit Long Term Support (LTS) veröffentlicht haben.

Ein Bereich, in dem das aktuelle Release an Java 21 anschließt, ist Project Loom, das auf eine verbesserte und schlankere Nebenläufigkeit für Java-Programme zielt. Loom bedeutet Webstuhl, also das Werkzeug, um die Fäden (Threads) zu einem großen Ganzen zusammenzufügen.

Java 21 hatte in dem Bereich die Virtual Threads finalisiert. Ebenfalls im Project Loom sind Structured Concurrency und Scoped Values aufgehängt, die im Vorgänger den Preview-Status erhalten haben und die Java 22 nun als zweite Preview fortführt.

Structured Concurrency hilft dabei, Tasks aus unterschiedlichen Threads in einer Einheit zu verwalten, um die Wartbarkeit und Zuverlässigkeit von nebenläufigem Code zu verbessern. Sie war ursprünglich als JEP 428 in JDK 19 im Inkubator enthalten, in dem sie als JEP 437 in Java 20 blieb. Erst in Java 21 erreichte das Konzept im JEP 453 die Preview-Phase und wechselt nun als "JEP 462: Structured Concurrency" in die zweite Vorschau.

Inkubator und Preview

Bei der Weiterentwicklung des OpenJDK ist der Inkubator die experimentelle Stufe vor der Preview. Sie zeigt an, dass die Funktionen bislang nicht ausgereift sind, sich grundlegend ändern können und eventuell gar nicht in die Sprache einfließen. Den Inkubator durchlaufen nicht alle Neuerungen, sondern einige gehen direkt in die Preview und andere sogar ohne Vorschau in die Sprache über.

Preview-Features sind vollständig spezifiziert und implementiert, können aber noch Veränderungen erfahren. Zwar gibt es keine Garantie, dass sie tatsächlich in der Sprache landen, aber bei Preview-Features ist das sehr wahrscheinlich, wie die Vergangenheit gezeigt hat.

Die im OpenJDK 20 als JEP 429 erstmals eingeführten Scoped Values sind ein Konzept, um unveränderliche Werte innerhalb von und zwischen Threads auszutauschen. Sie sind eine effizientere Alternative zu ThreadLocal-Variablen. Wie diese gelten die Werte prinzipiell nur für den jeweiligen Thread. Der gleiche ScopedValue kann in unterschiedlichen Threads verschiedene Werte annehmen. In dem Zusammenhang handelt es sich bei Scope nicht wie sonst in Java um den lexikalischen Bereich einer Klasse oder Funktion, sondern um einen dynamischen Bereich, den die Laufzeit durch das Binden des Werts vorgibt. Die Scoped Values haben in Java 21 mit dem JEP 446 die Vorschauphase betreten, die sie in Java 22 als "JEP 464: Scoped Values" in der zweiten Preview fortführen.

Gleich vier der Neuerungen in Java 22 gehören zum Project Amber. In dem "Bernstein"-Projekt finden sich kleinere Sprachfeatures, die vor allem auf eine gesteigerte Produktivität zielen.

String Templates sind gleich ohne Inkubator-Phase mit dem JEP 430 als Preview in Java 21 eingezogen. Sie ergänzen die String-Literale und Textblöcke und ermöglichen die Interpolation von Strings. Damit wird es auch möglich, Template-Prozessoren zu definieren, um beispielsweise JSON-Objekte aus Texten mit Platzhaltern generieren. Die zweite Vorschau "JEP 459 String Templates" für Java 22 bringt nur minimale Anpassungen gegenüber dem ersten JEP mit und dient vor allem dazu, zusätzliches Feedback aus der Community zu sammeln, bevor das Feature endgültig in die Sprache einfließt.

Das ebenfalls als zweite Preview gekennzeichnete "JEP 463: Implicitly Declared Classes and Instance Main Methods" bringt seit dem ersten Entwurf für Java 21 eine leichte Anpassung mit, die unter anderem das Aufrufen der main-Methode vereinfachen soll. Außerdem ändert das Proposal den Namen: Der Vorgänger hieß "JEP 445: Unnamed Classes and Instance Main Methods". Das Ziel ist geblieben: Die main-Methode soll schlanker werden und sich mit weniger Boilerplate-Code umsetzen lassen.

Dank des JEP 463 darf man künftig auf überflüssigen Code verzichten. Warum Oracle in dem Beispiel allerdings die Welt innerhalb der Zeichenkette entfernt, bleibt ein Rätsel.

(Bild: Oracle)

Namenlose Variablen und Patterns dienen ebenfalls dem Vermeiden von Overhead: Wenn Variablendeklarationen oder verschachtelte Patterns syntaktisch erforderlich sind, aber eine Anwendung die Inhalte nicht nutzt, lassen sie sich durch einen einfachen Unterstrich (Underscore _) ersetzen. Das Feature gilt mit dem "JEP 456: Unnamed Variables & Patterns" als fertig, nachdem Java 21 das JEP 443 als Preview eingebracht hatte.

Das neu als Preview eingeführte "JEP 447: Statements before super(...)" erlaubt das Brechen einer alten Regel: Wenn ein Java-Konstruktor den Konstruktor der Oberklasse aufruft, war kein Code vor super erlaubt. Das ändert das Proposal, wobei allerdings kein Code erlaubt ist, der auf die zu erstellende Instanz zugreift. Das stellt sicher, dass das Erstellen des Objekts von oben nach unten erfolgt, also jeweils die Oberklasse vor den Unterklassen initialisiert wird.

Als einen Anwendungsfall für die Neuerung zeigt das Proposal einen Konstruktor, der einen Wert überprüft, bevor er den Konstruktor der Oberklasse aufruft, um bei einem unerlaubten Wert direkt eine Exception zu werfen:

public class PositiveBigInteger extends BigInteger {

  public PositiveBigInteger(long value) {
    if (value <= 0)
      throw new IllegalArgumentException("non-positive value");
    super(value);
  }
}

Project Panama zielt auf die Anbindung von Java-Programmen an nicht-Java- beziehungsweise JVM-Komponenten wie C-basierte Libraries und Interfaces.

Das OpenJDK finalisiert die einheitliche Schnittstelle zu Code und Daten jenseits der Java-Runtime mit dem "JEP 454: Foreign Function & Memory API". Die API ermöglicht den Java-basierten Zugriff auf native Libraries und Daten, "ohne die Zerbrechlichkeit und Gefahren des JNI" (Java Native Interface), wie es im Proposal heißt. Der Vorstoß startete mit der ersten Preview als JEP 424 im JDK 19, die auf den Vorgängern JEP 389 für die Foreign Linker API in Java 16 und die in Java 14 als JEP 370 gestartete Foreign-Memory Access API aufbaute. Nach der zweiten und dritten Preview als JEP 434 in Java 20 und als JEP 442 in Java 21 gilt die API nun als stabil.

Auf dem Weg zum Rekordträger des längsten Inkubator-Status befindet sich die Vector API, die in Java 16 als JEP 338 das erste Mal auftrat und seitdem in allen JDKs weiterentwickelt wurde, aber immer noch keinen Preview-Status hat. Somit ist "JEP 460: Vector API" die siebte Inkubator-Instanz. Das Proposal dient dazu, aktuelle CPU-Architekturen und Befehlserweiterungen wie Single Instruction Multiple Data (SIMD) und Vektorprozessoren für die Vektorberechnung zu nutzen.