Java 22 – die neuen Features kurz vorgestellt

18.03.2024

Morgen am 19.03.2024 – auf den Tag genau ein halbes Jahr nach der LTS-Version Java 21 – erscheint gemäß des halbjährlichen Release-Zyklus die neue Java-Version mit der Nummer 22. Welche Neuerungen das Release mit sich bringt, ist in diesem Blogbeitrag nachzulesen.

JEP-423: Region Pinning for G1

Javas Standard-Garbage-Collector G1 kann im Zusammenhang mit JNI (Java Native Interface) zu Problemen führen, wie etwas minutenlanges Blockieren einer Anwendung, Verursachung unnötiger Out-of-Memoriy-Zustände, oder vorzeitiges Beenden der JVM. Mit diesem JEP sollen diese Probleme behoben werden. Wer sich für die Hintergründe und technischen Details interessiert, kann sich das entsprechende JDK Enhancement Proposal Nr. 423 durchlesen.

JEP-454: Foreign Function & Memory API

Durch diese neue API soll JNI abgelöst werden. Sie dient dazu, von Java-Programmen aus mit Code und Speicherbereichen außerhalb der Java-Laufzeitumgebung zu interagieren. Durch den effizienten Aufruf fremder Funktionen (also Code außerhalb der JVM) sowie den sicheren Zugriff auf externen Speicher, der nicht von der JVM verwaltet wird, ermöglicht die API Java-Programmen den Aufruf nativer Bibliotheken und die Verarbeitung nativer Daten ohne die Fragilität und die Gefährlichkeit von JNI (Java Native Interface).

Bereits seit Java 17 ist diese API als Incubator- bzw. Preview-Feature vorhanden. Mit Java 22 wird nun die endgültige, finalisierte Version der API geliefert.

Codebeispiel 1 – Allokieren eines fremden Speicherbereichs:

Arena steuert den Lebenszyklus externer Speichersegmente und ermöglicht sowohl eine flexible Allokation als auch eine zeitnahe Freigabe.

MemorySegment ermöglicht den Zugriff auf einen zusammenhängenden Bereich des Speichers.

Der oben gezeigte Code allokiert einen Off-Heap-Speicherbereich, der groß genug ist um 10 Werte des primitiven Typs int zu speichern, und füllt ihn mit Werten von 0 bis 9. Anschließend wird der Wert am Index 3 ausgelesen und ausgegeben.

Codebeispiel 2 – Aufruf der externen C-Funktion „strlen“ zur Ermittlung der Länge eines Strings:

Über die Linker-Klasse erhält man Zugriff auf fremde Funktionen vom Java-Code aus, sowie Zugriff auf den Java-Code von den externen Funktionen aus.

MethodHandles gibt es bereits seit Java 7; sie wurde als performantere Option zu Reflection eingeführt. Nun können sie nicht mehr nur auf Java-Methoden, sondern auch auf fremde Funktionen verweisen.

Im obigen Codebeispiel wird ein Speichersegment allokiert, welches das Wort „Hello“ als C-String beinhaltet.

Über den MethodHandle „strlen“ wird via „invokeExact“ der native Funktionsaufruf getätigt.

Die Codebeispiele stammen aus dem Javadoc des Packages „java.lang.foreign“ , das eine ausführliche Beschreibung der neuen API enthält.

JEP-456: Unnamed Variables & Patterns

In Java 21 als Preview-Feature eingeführt, ist dieses Feature nun unverändert und finalisiert in Java 22 enthalten.

Nicht genutzte Komponenten in Record Patterns oder ungenutze Variablen müssen nun nicht mehr benannt werden. Stattdessen können sie den Unterstrich „_“ als Bezeichner erhalten. Dies macht den Code besser verständlich, da der Entwickler so explizit ausdrücken kann, dass ein bestimmtes Konstrukt, das im Code angegeben werden muss, nicht benötigt wird.

Möchte man in einem Record Pattern für Point nur die x-Koordinate verwenden, nicht aber die y-Koordinate, kann man dies wie folgt schreiben:

Es ist auch möglich, den Datentyp wegzulassen:

Zudem können außerhalb von Patterns auch ungenutzte Variablen entsprechend benannt werden:

Auch für Exceptions in catch-Anweisungen kann _ verwendet werden:

Dasselbe gilt für ungenutzte Parameter in Lambdas. In Zeile 6 wird beispielsweise ein CommandLineRunner definiert, der die Kommandozeilenparameter nicht benötigt:

JEP-458: Launch Multi-File Source-Code Programs

Seit JEP-330 in Java 11 ist es möglich, *.java-Dateien direkt auszuführen, sofern das komplette Programm in der Datei enthalten ist. Ein expliziter Aufruf des Compilers javac ist nicht nötig.

Ab Java 22 ist es nun möglich, *.java-Dateien auch dann auszuführen, wenn das beinhaltete Programm aus mehreren Quelldateien besteht.

Gegeben sei ein Programm, das aus den folgenden beiden Klassen besteht:

Das Programm kann nun gestartet werden mit dem Kommando

Es ist auch möglich, vorkompilierte *.class-Files sowie *.jar-Dateien mit einzubinden.

Die folgende Variante der Greeter-Klasse verwendet z.B. die StringUtils-Klasse der commons-lang3-Bibliothek:

Legt man nun die commons-lang3.jar in einem Unterverzeichnis namens „libs“ relativ zu MultiFileProgram.java ab, kann das Programm wie folgt gestartet werden:

Diese Erweiterung ist dafür gedacht, Neueinsteigern den Start mit Java zu erleichtern, bzw. den Initialaufwand für das Projektsetup so gering wie möglich zu halten. Bei einfachen Multi-Source-Programmen besteht so nicht die Notwendigkeit, sich auch noch mit der Komplexität eines Build-Tools auseinandersetzen zu müssen.

Und die Preview-Features?

Natürlich sind in Java 22 auch wieder eine ganze Reihe spannende Preview-Features enthalten. Diese behandle ich in Kürze in einem separaten Blogbeitrag.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*