5. Pattern Matching mit Switch
Die Java-Verantwortlichen haben die Sprache allerdings auch auf unterster syntaktischer Ebene optimiert, um Entwickler zu einer saubereren, ausdrucksstarken Logik zu führen. Dabei unterstützt das Keyword switch (mit dem Stacks von if-then-else
-Konditionalen kreiert werden können) jetzt auch Pattern Matching. Das hat zur Folge, dass die Logik, um verschiedene Cases zu spezifizieren, nicht auf grundlegende Expressions wie equals
beschränkt ist.
Java-Code, der mit diesen Mustern geschrieben wurde, ist besonders prägnant und zudem in der Lage, nicht nur nach dem Value innerhalb der Daten, sondern auch nach Objekttyp zu differenzieren. Dazu können alle Referenztypen und der Null Pointer verwendet werden. Selbstverständlich wird die traditionelle Logik mit Fall-Through-Semantik weiterhin unterstützt - alter Code läuft also auch weiterhin reibungslos.
6. Vereinheitlichte Syntax
Obwohl Java im Kern eine tiefe Verwandtschaft mit Lisp aufweist, unterschied sich die Programmierarbeit anfangs nicht wesentlich vom Vorgehen bei C oder C++. Geschweifte Klammern und Semikolons wirkten nahezu identisch, Loops wurden klassisch dreiteilig strukturiert.
Inzwischen sind allerdings Ergänzungen neuerer Skriptsprachen wie Ruby und Python eingeflossen: For-Loops etwa müssen nicht mehr bis ins kleinste Detail beschrieben werden, weil der Compiler sie intuitiv erkennt, sobald sie eine Liste oder ein Array durchlaufen. Anonyme Funktionen und Lambda-Expressions sind weitere Wege für Developer, Tastenanschläge einzusparen.
7. Sealed Classes
Die JVM war von Anfang an darauf ausgelegt, viele gängige Sicherheitslücken zu schließen, die Entwickler (versehentlich) in ihren Programmen hinterlassen könnten. Diese Fähigkeiten wurden inzwischen um zahlreiche weitere Features ergänzt - zum Beispiel Sealed Classes in Java 17. Damit lässt sich genau definieren, welche Klassen erweitert werden dürfen und somit verhindern, dass grundlegende Funktionen von Dritten überschrieben werden können.
Sealed Classes bieten gegenüber herkömmlichen Klassen zudem Geschwindigkeitsvorteile und ermöglichen eine aggressivere Optimierung und Inlining.
8. Foreign Functions und Memory
Die Java Virtual Machine war ursprünglich als "Walled Garden" oder "Typesafe Sandbox" konzipiert: Sie "bewacht" den Code und verhindert viele Angriffe, die möglich werden, wenn dieser nativ ausgeführt wird. Das ursprüngliche Java Native Interface (JNI) war für viele Entwickler, die auf Bibliotheken und Stacks zugreifen mussten, die in anderen Sprachen geschrieben waren, eine Art Hintertür.
Inzwischen gibt es die Foreign Function & Memory API (derzeit in der dritten Preview). Diese Schnittstelle gestaltet es erheblich einfacher und sicherer, externe Verbindungen herzustellen. Dazu kommen verbesserte Schutzmechanismen wie Type Checking, um potenzielle Overflow-Angriffe zu verhindern. Diese API kann dafür sorgen, dass Java künftig auch vermehrt für Low-Level- und Data-Processing-Aufgaben zum Einsatz kommt. Und sie bietet Programmierern einen sichereren Weg, aus der Sandbox auszubrechen.
9. Vector API
Die ursprüngliche Vector-Klasse war mehr eine Datenstruktur als ein mathematisches Tool - eine flexible und synchronisierte Lösung, um Objekte zu speichern, die sich nicht wesentlich von List
unterschied. Ganz anders die neue Vector API: Sie ist ein Werkzeug für mathematische Datenverarbeitung, die im KI-Zeitalter immer häufiger relevant wird. Bei den einzelnen Elementen kann es sich um primitive Typen handeln. Viele grundlegende mathematische Operationen wie Dot Products werden unterstützt.
Der Unterschied zwischen der Vector
werden dabei automatisch erstellt. Unterdessen sorgt die JVM für die Unveränderlichkeit deradd
-Methode: In der Original-Klasse wird einfach ein Objekt ans Ende der Datenstruktur angehängt, wie bei allen anderen Collections-Klassen auch. In der API wird sie verwendet, um die einzelnen Elemente mathematisch zu addieren. Die Vector API verspricht zudem, die enorme Rechenleistung einiger neuerer SIMD-Prozessoren zu erschließen und Java-Programmierer in die Lage zu versetzen, Code zu erstellen, der viele lange Vektoren durchlaufen kann.
10. Besseres Null Processing
ist die Default-Option, die einen optimierten Durchsatz mit kürzeren Pausen bietet. G1 baut auf Techniken auf, die aus früheren Iterationen der Java-Garbage-Collection entstanden sind.
Die Stream API kann beispielsweise lange Datenströme verarbeiten und bleibt nicht hängen, wenn gelegentlich ein Nullwert auftaucht. Devs die das prüfen wollen, nutzen den Null-Safe-Operator (?
.), der das auf sehr prägnante Art und Weise erledigt.
11. Keine Kosten - zumindest für Devs
Java war - zumindest für Softwareentwickler - schon immer kostenlos. Sun Microsystems wusste die Devs zu locken und unternahm 1997 den mutigen Schritt, Teile der Sprache und die JVM als quelloffene Software anzubieten.
Seitdem Sun im Jahr 2010 von Oracle geschluckt wurde, gestaltet sich das Lizenzgebahren etwas undurchsichtiger. Viele Java-Versionen von Oracle sind kostenlos, einige erfordern aber Lizenzen mit bemerkenswerten Bedingungen. Scheinbar versucht das Unternehmen Programmierern weiterhin kostenlosen Zugang zu ermöglichen, während Unternehmen, die vom Einsatz von Java finanziell profitieren, zahlen sollen. In der Praxis bedeutet das, dass Oracle für die sogenannten "Subscription Features" Geld verlangt. Java ist also nur dann kostenlos, wenn Sie es nicht kommerziell nutzen wollen. (fm)