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
