Java 12 ist da!

18.03.2019

Seit dem Erscheinen von Java 11 ist schon wieder ein halbes Jahr vergangen. Gemäß dem neuen Releasezyklus bedeutet dies, dass das nächste Major Release vor der Tür steht. Am morgigen Dienstag, den 19.03.2019 ist es wieder soweit: Java 12 wird öffentlich verfügbar.

Die Features

Nachfolgend die Liste der enthaltenen Features (JEP = JDK Enhancement Proposal):

JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
JEP 230: Microbenchmark Suite
JEP 325: Switch Expressions (Preview)
JEP 334: JVM Constants API
JEP 340: One AArch64 Port, Not Two
JEP 341: Default CDS Archives
JEP 344: Abortable Mixed Collections for G1
JEP 346: Promptly Return Unused Committed Memory from G1

Viele der Neuerungen dürften insbesondere für diejenigen interessant sein, die mit der Entwicklung von performancekritischen Anwendungen beschäftigt sind. Beispielsweise ist ein neuer, experimenteller Garbage Collector namens Shenandoah enthalten (JEP 189), der auf minimale, nur wenige Millisekunden andauernde JVM-Pausierungen optimiert ist und bei hochverfügbaren Anwendungen zum Einsatz kommen soll. Auch die letzten beiden JEPs (344 und 346) sind Optimierungen der Garbage Collection; hier im G1 GC, dem Standard-GC seit Java 9.

Auch die restlichen Erweiterungen sind – mit einer Ausnahme – Optimierungen „unter der Haube“ der JVM. Das einzige Feature, das Auswirkungen auf die Sprache selbst hat, ist die Preview für Switch Expressions.

Java Preview Features

Preview Features wurden im Zuge der halbjährlichen Releases eingeführt. Laut Brian Goetz, Architekt von Java bei Oracle, dienen sie dazu, Feedback zu neuen, im Prinzip fertig spezifizierten und implementierten Sprachfeatures, einzuholen. Werden in diesem Rahmen von der Java-Community Fragen oder Probleme  aufgeworfen, die von den Java-Architekten nicht bedacht wurden, sind Nachbesserungen möglich – so Goetz in einem InfoQ-Podcast über Java und das JDK.

Preivew Features sind also zum Ausprobieren gedacht, nicht aber für den produktiven Einsatz. Denn es ist durchaus möglich, dass sich bis zur finalen Version nochmal Änderungen ergeben, oder das Feature gar wieder wegfällt. Daher müssen Preview Features auch extra via Command Line Parameter in Compiler und VM aktiviert werden.

Ursprünglich hätte Java 12 ein weiteres Preview Feature enthalten sollen: die „Raw String Literals“ (JEP 326). Doch dieses wurde wieder zurückgezogen, da die Java-Architekten der Meinung waren, dass das aktuelle Design noch nicht das Bestmögliche sei, und weitere Optionen ausgelotet werden sollten.

Switch Expressions

Das in Java enthaltene switch-Konstrukt wird im Rahmen von JEP 325 so erweitert, dass man es auch als Ausdruck schreiben kann, also als eine Anweisung, die einen Wert zurückgibt.

Dafür wurde eine neue Syntax eingeführt. Statt des Doppelpunkts schreibt man bei den case-Labels einen Lambda-Pfeil ( -> ), wenn man switch als Ausdruck verwenden will:

int w = ...

String weekday = switch(w){
  case 1 -> "Montag";
  case 2 -> "Dienstag";
  case 3 -> "Mittwoch";
  case 4 -> "Donnerstag";
  case 5 -> "Freitag";
  case 6 -> "Samstag";
  case 7 -> "Sonntag";
  default -> "kein Wochentag";
};
System.out.println("Es ist " + weekday);

Ein Unterschied zum herkömmlichen Statement ist, dass kein Fallthrough mehr passiert. Das Schlüsselwort break wird demnach bei Verwendung der neuen Syntax nicht mehr benötigt. Hat w den Wert 1, bekommt die Variable weekday den Wert „Montag“ zugewiesen, und die Ausgabe lautet entsprechend „Es ist Montag“.

Wichtig ist außerdem, dass im Falle eines switch-Ausdrucks die case-Labels alle möglichen Fälle abdecken müssen. In der Regel bedeutet dies, dass ein default-Label vorhanden sein muss. Lediglich bei Enums reicht es aus, alle Enum-Werte in den case-Labels aufzuzählen. Werden nicht alle Fälle erschöpfend behandelt, meldet der Compiler einen Fehler.

Zudem ist es möglich, switch-Statements mit der neuen Syntax zu schreiben, d.h. mit Lambda-Pfeil, aber ohne Wertzuweisung. In diesem Fall müssen die case-Optionen nicht erschöpfend sein. Somit funktioniert auch der folgende Code:

int onOff = ...

switch (onOff) {
  case 0 -> System.out.println("System ist aus");
  case 1 -> System.out.println("System ist an");
}

Auch hier gibt es keinen Fallthrough. Hat onOff den Wert 0, wird lediglich „System ist aus“ ausgegeben; beim Wert 1 erscheint die Ausgabe „System ist an“. Bei allen anderen Werten erfolgt gar keine Ausgabe.

Die herkömmliche Syntax mit Doppelpunkt bleibt aus Gründen der Rückwärtskompatibilität unverändert. Die neue Syntax ist meines Erachtens wegen des fehlenden Fallthroughs leichter verständlich und weniger fehleranfällig als die alte. Bei Java-Neulingen jedoch wird es wohl eher zu Verwirrung führen, dass es zwei verschiedene Schreibweisen mit unterschiedlichen Funktionsweisen gibt.

Der switch-Ausdruck ist übrigens ein Vorbote von Pattern Matching, das in einer der künftigen Java-Versionen enthalten sein soll. Welche Version das sein wird weiß allerdings niemand, da – laut Goetz – keine Termine für Features geplant werden. Stattdessen werden Features stets dann ins JDK integriert, wenn sie fertig sind.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*