Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 17 (Java Platform, Standard Edition 17) veröffentlicht, wobei das OpenJDK-Projekt als Referenzimplementierung dient. Abgesehen von der Entfernung einiger veralteter Funktionen bietet Java SE 17 volle RĂŒckwĂ€rtskompatibilitĂ€t zu frĂŒheren Versionen der Java-Plattform â die Mehrheit der zuvor geschriebenen Java-Projekte wird ohne Ănderungen unter der neuen Version lauffĂ€hig sein. Fertige Installationspakete fĂŒr 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 Referenzimplementierung von Java 17 ist vollstĂ€ndig unter der GPLv2-Lizenz mit Ausnahmen fĂŒr GNU ClassPath offen, die dynamisches Linking mit kommerziellen Produkten erlauben.
Java SE 17 gehört zur Kategorie der Versionen mit LangzeitunterstĂŒtzung (LTS), fĂŒr die Updates bis 2029 veröffentlicht werden. Die Aktualisierungen fĂŒr die vorherige Zwischenversion Java 16 wurden eingestellt. Der vorherige LTS-Zweig Java 11 wird bis 2026 unterstĂŒtzt. Die nĂ€chste LTS-Version ist fĂŒr September 2024 geplant. Wir erinnern daran, dass mit der Veröffentlichung von Java 10 das Projekt auf einen neuen Entwicklungsprozess umgestiegen ist, der einen kĂŒrzeren Zyklus fĂŒr die Erstellung neuer Versionen umfasst. Neue Funktionen werden nun in einem stĂ€ndig aktualisierten Master-Zweig entwickelt, in den fertige Ănderungen integriert werden, und von dem alle sechs Monate StabilitĂ€tszweige fĂŒr neue Versionen abgezweigt werden.
Zu den Neuerungen in Java 17 gehören:
- Eine experimentelle Implementierung der Musterabgleichung in âswitchâ-AusdrĂŒcken wurde vorgeschlagen, die es ermöglicht, in den âcaseâ-Labels keine genauen Werte, sondern flexible Muster zu verwenden, die eine Reihe von Werten abdecken, fĂŒr die zuvor umstĂ€ndliche âifâŠelseâ-Ketten verwendet werden mussten. DarĂŒber hinaus wurde innerhalb von âswitchâ die Möglichkeit zur Verarbeitung von NULL-Werten implementiert. 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 Interfaces, die von anderen Klassen und Interfaces nicht zur Vererbung, Erweiterung oder Ăberschreibung der Implementierung verwendet werden können, wurde stabilisiert. Versiegelte Klassen bieten auch eine deklarativere Möglichkeit, die Verwendung von Superklassen einzuschrĂ€nken, als Zugriffsmodifikatoren, die auf einer expliziten AufzĂ€hlung der erlaubten Unterklassen basieren. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- Die zweite vorlĂ€ufige Implementierung der Vector-API wurde vorgestellt, die Funktionen fĂŒr Vektorverarbeitung bereitstellt. Diese werden unter Verwendung von Vektor-Befehlen der x86_64- und AArch64-Prozessoren ausgefĂŒhrt und ermöglichen die gleichzeitige Anwendung von Operationen auf mehrere Werte (SIMD). Im Gegensatz zu den Auto-Vektorisierungsfunktionen fĂŒr skalare Operationen, die im JIT-Compiler HotSpot bereitgestellt werden, ermöglicht die neue API eine explizite Steuerung der Vektorisierung zur parallelen Datenverarbeitung.
- Die vorlĂ€ufige Implementierung der API fĂŒr Fremdfunktionen & Speicher wurde hinzugefĂŒgt. Mit dieser können Anwendungen mit Code und Daten interagieren, die auĂerhalb der Java-Laufzeit liegen. Die neue API ermöglicht es, Funktionen, die nicht in der JVM ausgefĂŒhrt werden, effizient aufzurufen und auf nicht von der JVM verwalteten Speicher zuzugreifen. So können beispielsweise Funktionen aus externen Shared Libraries aufgerufen und Daten von Prozessen ohne Verwendung von JNI abgerufen werden.
- Eine Rendering-Engine fĂŒr macOS, die die Java 2D-API unterstĂŒtzt, welche wiederum in der Swing-API verwendet wird, wurde fĂŒr die Nutzung der Grafik-API Metal angepasst. StandardmĂ€Ăig wird auf der Plattform macOS weiterhin OpenGL verwendet. Um die UnterstĂŒtzung fĂŒr Metal zu aktivieren, ist das Setzen der Option â-Dsun.java2d.metal=trueâ erforderlich, und es muss mindestens die Version macOS 10.14.x installiert sein.
- Ein Port fĂŒr die Plattform macOS/AArch64 (Apple-Computer mit den neuen Apple M1-Chips) wurde hinzugefĂŒgt. Besonderheit dieses Ports ist die UnterstĂŒtzung des W^X-Speicherschutzmechanismus (Write XOR Execute), bei dem Speicherseiten nicht gleichzeitig zum Schreiben und AusfĂŒhren zugĂ€nglich sein können. (Code kann nur nach Verhinderung von Schreibzugriff ausgefĂŒhrt werden, und das Schreiben in eine Speicherseite ist nur nach Verhinderung der AusfĂŒhrung möglich).
- Die Verwendung der strikten (strictfp) Semantik fĂŒr Gleitkomma-AusdrĂŒcke wurde wiederhergestellt. Die UnterstĂŒtzung fĂŒr die ab Version Java 1.2 verfĂŒgbare âdefaultâ-Semantik, die Vereinfachungen fĂŒr den Betrieb auf Systemen mit sehr alten mathematischen Coprozessoren x87 beinhaltete, wurde eingestellt (nach der EinfĂŒhrung von SSE2-Anweisungen war die Notwendigkeit fĂŒr diese zusĂ€tzliche Semantik verschwunden).
- Es wurden neue Schnittstellentypen fĂŒr Pseudorandomzahlengeneratoren implementiert sowie zusĂ€tzliche Algorithmen fĂŒr eine qualitativ hochwertigere Zufallszahlengenerierung realisiert. Anwendungen haben nun die Möglichkeit, den Algorithmus zur Generierung von Pseudorandomzahlen auszuwĂ€hlen. Zudem wurde die UnterstĂŒtzung fĂŒr die Generierung von Strömen zufĂ€lliger Objekte verbessert.
- Es wurde eine zwingende strikte Kapselung aller internen Elemente des JDK implementiert, mit Ausnahme kritischer APIs wie sun.misc.Unsafe. Die strikte Kapselung blockiert Versuche, aus dem Code auf interne Klassen, Methoden und Felder zuzugreifen. Zuvor konnte der Modus der strikten Kapselung ĂŒber die Option ââillegal-access=permitâ deaktiviert werden, diese ist jetzt als veraltet markiert. Anwendungen, die Zugriff auf interne Klassen, Methoden und Felder benötigen, sollten diese ausdrĂŒcklich mit Hilfe der Option ââadd-opensâ oder des Attributes Add-Opens in der Manifestdatei definieren.
- Anwendungen haben die Möglichkeit, Filter fĂŒr die Deserialisierung von Daten zu definieren, die kontextabhĂ€ngig sind und dynamisch in Verbindung mit bestimmten Deserialisierungsoperationen ausgewĂ€hlt werden können. Die festgelegten Filter sind auf das gesamte Objekt anwendbar. virtuellen Maschine (JVM-weit), d.h. sie umfassen nicht nur die Anwendung selbst, sondern auch die in der Anwendung verwendeten externen Bibliotheken.
- In Swing wurde die Methode javax.swing.filechooser.FileSystemView.getSystemIcon hinzugefĂŒgt, um groĂe Icons zu laden, was die Gestaltung der BenutzeroberflĂ€che auf Bildschirmen mit hoher Pixeldichte (HighDPI) verbessert.
- Die API java.net.DatagramSocket unterstĂŒtzt jetzt die Verbindung zu Multicast-Gruppen, ohne dass eine separate API java.net.MulticastSocket verwendet werden muss.
- Das Tool IGV (Ideal Graph Visualizer) wurde verbessert, um eine interaktive Visualisierung des Zwischencodes im JIT-Compiler HotSpot VM C2 zu ermöglichen.
- In der JavaDoc wird nun analog zum Compiler javac bei der Fehlerausgabe die problematische Zeilennummer in der Quelldatei und der Fehlerort angegeben.
- Das Attribut native.encoding wurde hinzugefĂŒgt, das den Namen der Systemzeichencodierung (UTF-8, koi8-r, cp1251 usw.) widerspiegelt.
- Das Interface java.time.InstantSource wurde hinzugefĂŒgt, um die Zeit unabhĂ€ngig von der Zeitzone zu manipulieren.
- Die API java.util.HexFormat wurde hinzugefĂŒgt, um die Konvertierung in und aus der hexadezimalen Darstellung zu ermöglichen.
- Der Compiler hat einen Blackhole-Modus hinzugefĂŒgt, der die AusfĂŒhrung von nicht verwendetem Code (dead-code elimination) deaktiviert. Dies kann bei Leistungstests verwendet werden.
- Im Runtime wurde die Option «-Xlog:async» hinzugefĂŒgt, um Logs asynchron zu schreiben.
- Bei der Einrichtung von gesicherten Verbindungen wird standardmĂ€Ăig TLS 1.3 verwendet (zuvor wurde TLS 1.2 genutzt).
- Das zuvor als veraltet erklĂ€rte API Applet (java.applet.Applet*, javax.swing.JApplet), das zum Starten von Java-Anwendungen im Browser verwendet wurde, wurde in die Kategorie der zur Entfernung vorgemerkten APIs verschoben (nachdem die UnterstĂŒtzung fĂŒr das Java-Plugin in Browsern eingestellt wurde, ist es nicht mehr relevant).
- Der Security Manager, der seit langem obsolet ist und nach der Einstellung der UnterstĂŒtzung fĂŒr Browser-Plugins nicht mehr benötigt wird, wurde in die Kategorie der zur Entfernung vorgemerkten Komponenten verschoben.
- Der RMI Activation-Mechanismus, der veraltet ist, wurde bereits in Java 8 in den Status einer Option ĂŒberfĂŒhrt und findet in der modernen Praxis kaum noch Anwendung.
- 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 (ahead-of-time) Modus fĂŒr die Kompilierung 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 Entwicklungen des Graal-Projekts. Es wird angemerkt, dass die Wartung des Compilers einen hohen Aufwand erfordert, der sich unter den UmstĂ€nden der geringen Nachfrage bei Entwicklern nicht rechtfertigt.
Quelle: opennet.ru
