© Anjar Sumawi/Shutterstock.com, © MoreVector/Shutterstock.com, © S&S Media/Bianca Röder
Die Neuerungen der aktuellen Version auf einen Blick

Java - die Vierzehnte


„Languages must evolve, or they risk becoming irrelevant“, sagte Brian Goetz (Oracle) im November 2019 während seiner Präsentation „Java Language Futures“ bei der Devoxx in Belgien. Er ist als Java Language Architect maßgeblich daran beteiligt, dass Java trotz seiner 25 Jahre noch lange nicht zum alten Eisen gehört. In diesem Artikel werfen wir einen Blick auf die Neuerungen des JDK 14.

Oracle hat in den vergangenen Jahren einige wegweisende Entscheidungen getroffen. Dazu zählt das neue, halbjährliche Releasemodell mit den Preview-Features und den kürzeren Veröffentlichungs- und Feedbackzyklen für neue Funktionen. Das Lizenzmodell wurde geändert, das Oracle JDK wird nicht mehr kostenfrei angeboten. Das hat den Wettbewerb angekurbelt, und so bekommt man nun von diversen Anbietern, auch von Oracle, freie Distributionen des OpenJDK. Das ist seit Java 11 binärkompatibel zum Oracle JDK und steht unter einer Open-Source-Lizenz.

Vor anderthalb Jahren ist im Herbst 2019 mit Java 11 die letzte LTS-Version erschienen. Seitdem gab es bei den beiden folgenden Major-Releases jeweils nur eine überschaubare Menge an neuen Features. In den JDK-Inkubator-Projekten (Amber, Valhalla, Loom, …) wird aber bereits an vielen neuen Ideen gearbeitet, und so verwundert es nicht, dass der Funktionsumfang beim gerade veröffentlichten JDK 14 wieder deutlich größer ausfällt. Und auch wenn nur wenige die neue Version in Produktion einsetzen werden, sollte man trotzdem frühzeitig einen Blick auf die Neuerungen werfen und ggf. Feedback zu den Preview-Funktionen geben. Nur so wird sichergestellt, dass die neuen Features bis zur Finalisierung im nächsten LTS-Release, das als Java 17 im Herbst 2021 erscheinen wird, produktionsreif sind.

Die folgenden Java Enhancement Proposals (JEP) wurden umgesetzt [1]. Wir wollen in diesem Artikel die aus Entwicklersicht interessanten Themen genauer unter die Lupe nehmen.

  • JEP 305: Pattern Matching for instanceof (Preview)

  • JEP 343: Packaging Tool (Incubator)

  • JEP 345: NUMA-Aware Memory Allocation for G1

  • JEP 349: JFR Event Streaming

  • JEP 352: Non-Volatile Mapped Byte Buffers

  • JEP 358: Helpful NullPointerExceptions

  • JEP 359: Records (Preview)

  • JEP 361: Switch Expressions (Standard)

  • JEP 362: Deprecate the Solaris and SPARC Ports

  • JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector

  • JEP 364: ZGC on macOS

  • JEP 365: ZGC on Windows

  • JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination

  • JEP 367: Remove the Pack200 Tools and API

  • JEP 368: Text Blocks (Second Preview)

  • JEP 370: Foreign-Memory Access API (Incubator)

JEP 305: Pattern Matching für instanceof

Das Pattern-Matching-Konzept kommt bereits seit den 1960er Jahren bei diversen Programmiersprachen zum Einsatz. Zu den moderneren Vertretern zählen unter anderem Haskell und Scala. Ein Pattern ist eine Kombination aus einem Prädikat, das auf eine Zielstruktur passt, und einer Menge von Variablen innerhalb dieses Musters. Diesen Variablen werden bei passenden Treffern die entsprechenden Inhalte zugewiesen. Die Intention ist die Destrukturierung von Objekten, also das Aufspalten in ihre Bestandteile.

Bisher konnte man in Java im Switch Statement nur nach den Datentypen Integer, String und Enum unterscheiden. Durch die Einführung der Switch Expression in Java 12 wurde aber bereits der erste Schritt hin zum Pattern Matching vollzogen. Mit Java 14 können wir nun zusätzlich Pattern Matching beim instanceof-Operator nutzen. Dabei werden unnötige Casts vermieden, zudem erhöht sich durch die verringerte Redundanz die Lesbarkeit.

Vorher musste man beispielsweise für das Prüfen auf einen leeren String bzw. eine leere Collection wie folgt vorgehen:

boolean isNullOrEmpty( Object o ) { return == null || instanceof String && ((String) o).isBlank() || instanceof Collection && ((Collection) o).isEmpty(); }

Jetzt kann man beim Check mit instanceof den Wert direkt einer Variablen zuweisen und darauf weitere Aufrufe ausführen:

boolean isNullOrEmpty( Object o ) { return o == null || o instanceof String s && s.isBlank() || o instanceof Collection c && c.isEmpty(); }

Der Unterschied mag marginal erscheinen. Die Puristen unter den Java-Entwicklern sparen damit allerdings ei...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang