Nach sechsmonatiger Entwicklung hat das Unternehmen Oracle die Plattform Java SE 17 (Java Platform, Standard Edition 17) veröffentlicht, die auf dem offenen Projekt OpenJDK basiert. Abgesehen von der Entfernung einiger veralteter Funktionen bleibt Java SE 17 rĂŒckwĂ€rtskompatibel zu frĂŒheren Versionen der Java-Plattform â die meisten zuvor geschriebenen Java-Projekte werden ohne Ănderungen unter der neuen Version funktionsfĂ€hig sein. Installierbare Builds von Java SE 17 (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 Referenzimplementation von Java 17 ist vollstĂ€ndig unter der GPLv2-Lizenz mit Ausnahmen von GNU ClassPath veröffentlicht, die dynamisches Binden an kommerzielle Produkte erlauben.
Java SE 17 gehört zur Kategorie der Long-Term-Support (LTS)-Versionen, fĂŒr die Updates bis 2029 veröffentlicht werden. Die Veröffentlichung von Updates fĂŒr die vorherige Zwischenversion Java 16 wurde eingestellt. Die frĂŒhere LTS-Version Java 11 wird bis 2026 unterstĂŒtzt. Die nĂ€chste LTS-Version ist fĂŒr September 2024 geplant. Es sei daran erinnert, dass das Projekt mit der EinfĂŒhrung von Java 10 auf einen neuen Entwicklungsprozess umgestiegen ist, der kĂŒrzere Zyklen fĂŒr neue Versionen vorsieht. Neue Funktionen werden nun in einem stĂ€ndig aktualisierten Master-Zweig entwickelt, aus dem alle sechs Monate StabilitĂ€tsschbranch fĂŒr neue Versionen abgezweigt werden.
Zu den Neuerungen von Java 17 gehören:
- Eine experimentelle Implementierung von Muster-Matchings in âswitchâ-AusdrĂŒcken wurde vorgeschlagen, die es ermöglicht, in âcaseâ-Klauseln nicht nur exakte Werte, sondern flexible Muster zu verwenden, die mehrere Werte umfassen, fĂŒr die zuvor komplexe âifâŠelseâ-AusdrĂŒcke nötig waren. AuĂerdem wurden innerhalb des âswitchâ Möglichkeiten zur Verarbeitung von NULL-Werten geschaffen. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
- Die UnterstĂŒtzung fĂŒr versiegelte (âsealedâ) Klassen und Schnittstellen wurde stabilisiert, die von anderen Klassen und Schnittstellen nicht zur Vererbung, Erweiterung oder Ăberschreibung der Implementierung verwendet werden können. Versiegelte Klassen bieten auĂerdem eine deklarativere Möglichkeit, die Nutzung der Superklasse zu beschrĂ€nken, als Zugriffsmodifikatoren, die auf der expliziten Auflistung von Unterklassen basieren, die fĂŒr die Erweiterung zulĂ€ssig sind. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- Eine zweite Vorabversion der Vector-API wurde vorgeschlagen, die Funktionen fĂŒr Vektorberechnungen bereitstellt, die unter Verwendung von Vektorbefehlen der x86_64- und AArch64-Prozessoren ausgefĂŒhrt werden und es ermöglichen, Operationen gleichzeitig auf mehrere Werte (SIMD) anzuwenden. Im Gegensatz zu den vom JIT-Compiler HotSpot bereitgestellten Möglichkeiten zur automatischen Vektorisierung skalare Operationen, bietet die neue API die Möglichkeit, die Vektorisierung explicit zu steuern, um eine parallele Datenverarbeitung zu ermöglichen.
- Eine Vorabversion der API Foreign Function & Memory wurde hinzugefĂŒgt, mit der Anwendungen mit Code und Daten interagieren können, die auĂerhalb der Java-Laufzeitumgebung liegen. Die neue API ermöglicht es, Funktionen, die nicht in der JVM ausgefĂŒhrt werden, effizient aufzurufen und auf vom JVM nicht verwalteten Speicher zuzugreifen. Zum Beispiel können Funktionen aus externen Shared Libraries aufgerufen und auf Prozessdaten zugegriffen werden, ohne JNI zu verwenden.
- Die Rendering-Engine fĂŒr macOS, die das Java 2D API unterstĂŒtzt, das wiederum in der API Swing verwendet wird, wurde fĂŒr die Verwendung des Grafik-APIs Metal angepasst. StandardmĂ€Ăig wird auf der macOS-Plattform weiterhin OpenGL verwendet, und um die UnterstĂŒtzung fĂŒr Metal zu aktivieren, muss der Parameter â-Dsun.java2d.metal=trueâ gesetzt werden und mindestens macOS Version 10.14.x installiert sein.
- Ein Port fĂŒr die Plattform macOS/AArch64 (Apple-Computer mit den neuen Apple M1-Chips) wurde hinzugefĂŒgt. Eine Besonderheit des Ports ist die UnterstĂŒtzung des W^X (Write XOR Execute) Speicherschutzmechanismus, bei dem Speicherseiten nicht gleichzeitig zum Schreiben und AusfĂŒhren zugĂ€nglich sein können. (Code kann nur nach dem Verbot des Schreibens ausgefĂŒhrt werden, und Schreiben in eine Speicherseite ist nur nach dem Verbot der AusfĂŒhrung möglich.)
- Die Verwendung nur der strengen (strictfp) Semantik fĂŒr FlieĂkommadaten wird zurĂŒckgegeben. Die UnterstĂŒtzung der ab der Version Java 1.2 verfĂŒgbaren Semantik âdefaultâ, die Vereinfachungen fĂŒr die Arbeit auf Systemen mit sehr alten mathematischen Co-Prozessoren x87 beinhaltete, wurde eingestellt (nach EinfĂŒhrung der SSE2-Instruktionen wurde die zusĂ€tzliche Semantik ĂŒberflĂŒssig).
- Neue Typen von Schnittstellen zu Pseudo-Zufallszahlengeneratoren wurden implementiert, ebenso wie zusĂ€tzliche Algorithmen fĂŒr eine hochwertigere Generierung von Zufallszahlen. Anwendungen haben die Möglichkeit, einen Algorithmus zur Erzeugung von Pseudo-Zufallszahlen auszuwĂ€hlen. Die UnterstĂŒtzung der Generierung von Streams zufĂ€lliger Objekte wurde verbessert.
- Eine verpflichtende strenge Kapselung aller internen Elemente des JDK wurde umgesetzt, mit Ausnahme kritischer APIs wie sun.misc.Unsafe. Die strenge Kapselung blockiert Versuche, aus dem Code auf interne Klassen, Methoden und Felder zuzugreifen. Zuvor konnte der strenge Kapselungsmodus mit der Option ââillegal-access=permitâ deaktiviert werden, ist aber nun als veraltet erklĂ€rt. Anwendungen, die Zugriff auf interne Klassen, Methoden und Felder benötigen, sollten diese ausdrĂŒcklich mit der Option ââadd-opensâ oder dem Attribut Add-Opens in der Manifestdatei definieren.
- Anwendungen haben die Möglichkeit, Filter fĂŒr die Deserialisierung von Daten zu definieren, die vom Kontext abhĂ€ngen und dynamisch in Bezug auf bestimmte Deserialisierungsoperationen ausgewĂ€hlt werden können. Die festgelegten Filter gelten fĂŒr die gesamte virtuellen Maschine (JVM-weit), d.h. sie umfassen nicht nur die Anwendung selbst, sondern auch die in der Anwendung verwendeten Drittanbieter-Bibliotheken.
- In Swing wurde die Methode javax.swing.filechooser.FileSystemView.getSystemIcon hinzugefĂŒgt, um groĂe Icons zu laden, wodurch die Gestaltung der BenutzeroberflĂ€che auf Displays mit hoher Pixeldichte (HighDPI) verbessert wird.
- Im API java.net.DatagramSocket wurde die UnterstĂŒtzung fĂŒr die Verbindung zu Multicast-Gruppen ohne die Notwendigkeit eines separaten APIs java.net.MulticastSocket implementiert.
- Das Dienstprogramm IGV (Ideal Graph Visualizer) wurde verbessert und bietet eine interaktive Visualisierung der ZwischenreprÀsentation von Code im JIT-Compiler der HotSpot VM C2.
- In der JavaDoc wird nun Àhnlich wie im Compiler javac bei der Ausgabe von Fehlern die Nummer der problematischen Zeile in der Quelldatei und der Fehlerort angegeben.
- Die Eigenschaft native.encoding wurde hinzugefĂŒgt, die den Namen der Systemzeichencodierung (UTF-8, koi8-r, cp1251 usw.) widerspiegelt.
- Das Interface java.time.InstantSource wurde hinzugefĂŒgt, das die Manipulation von Zeit ohne Bezug zu Zeitzonen ermöglicht.
- Die API java.util.HexFormat wurde hinzugefĂŒgt, um in eine hexadezimale Darstellung zu konvertieren und umgekehrt.
- Im Compiler wurde der Modus blackhole hinzugefĂŒgt, der die Eliminierung ungenutzten Codes (dead-code elimination) deaktiviert, was bei Leistungstests nĂŒtzlich sein kann.
- Im Runtime wurde die Option â-Xlog:asyncâ hinzugefĂŒgt, um Logs asynchron zu schreiben.
- Bei der Installation gesicherter Verbindungen wird standardmĂ€Ăig TLS 1.3 verwendet (zuvor wurde TLS 1.2 verwendet).
- Die zuvor als veraltet erklĂ€rte API Applet (java.applet.Applet*, javax.swing.JApplet) wurde in die Kategorie der zur Löschung vorgesehenen Elemente verschoben, da sie fĂŒr die AusfĂŒhrung von Java-Anwendungen im Browser nicht mehr relevant ist (nachdem die UnterstĂŒtzung fĂŒr das Java-Plugin fĂŒr Browser eingestellt wurde).
- Der Security Manager, der seit langem veraltet ist und nach der Einstellung der UnterstĂŒtzung fĂŒr das Browser-Plugin nicht mehr benötigt wird, wurde in die Kategorie der zur Löschung vorgesehenen Elemente verschoben.
- Der RMI Activation-Mechanismus, der veraltet ist und bereits in Java 8 als Option eingestuft wurde, wurde entfernt und wird in der modernen Praxis kaum verwendet.
- Der experimentelle Compiler, der JIT (just-in-time) fĂŒr die dynamische Kompilierung von Java-Code fĂŒr die HotSpot JVM unterstĂŒtzt sowie den AOT-Modus (ahead-of-time) fĂŒr die Umwandlung von Klassen in Maschinencode vor dem Start der virtuellen Maschine, wurde aus dem SDK entfernt. Der Compiler wurde in Java geschrieben und basiert auf den Ideen des Graal-Projekts. Es wird hervorgehoben, dass die Wartung des Compilers groĂe ArbeitsaufwĂ€nde erfordert, die sich in einem Umfeld, in dem er bei Entwicklern nicht nachgefragt ist, nicht rechtfertigen lassen.
Quelle: opennet.ru
