Java 10

Nur sechs Monate nach Java 9 ist Java 10 fertig. Absurderweise ist damit Java 9, auf das die Java-Gemeinde dreieinhalb Jahre warten musste, schon wieder obsolet. Für Java 9 sind keine Updates mehr vorgesehen; aus Sicherheitsgründen ist ein Wechsel auf Java 10 also zwingend erforderlich. Auch Java 10 wird nur ein kurzes Leben haben: Im Herbst folgt bereits Java 11. Erst diese Version wird Long Time Support genießen, wobei aber noch unklar ist, wie lange die Long Time währen soll (siehe hier).

Die wichtigste Neuerung in Java 10 nennt sich Local-Variable Type Inference und erlaubt dem Compiler, den Variablentyp selbst zu erkennen. Die IntelliJ IDEA wird Java 10 ab Version 2018.1 unterstützen. Im aktuell verfügbaren Release Candidate funktioniert das schon wunderbar.

Local-Variable Type Inference

Offiziell weist Java 10 beachtliche 12 Neuerungen auf. Für viele Entwickler ist aber nur ein Feature wirklich bemerkenswert: Variablen können nun einfach mit var name deklariert werden (Local-Variable Type Inference). Der Java-Compiler erkennt richtigen bzw. einen geeigneten Typ aus dem Kontext. Ein paar Beispiele:

var i = 10;                          // int
var d = 18.3;                        // double
var s = "Java 10";                   // String
var sar = new String[];              // String array
var list = new ArrayList<String>();  // ArrayList<String>
var stream = list.stream();          // Stream<String>

Der Mechanismus scheitert allerdings bei der Initialisierung eines neuen Arrays aus einer Aufzählungen:

var iar = {1, 2, 3};                 // funktioniert nicht

Diese Einschränkung können Sie so umgehen (siehe auch stackoverflow):

int[] iar = {1, 2, 3};               // alte Syntax
var iar = new int[]{1, 2, 3};        // neue Syntax

Nicht zulässig ist die Deklaration mehrerer Variablen oder die Zuweisung von null:

var a=0, b=1;                        // funktioniert nicht
var c=null;                          // funktioniert auch nicht

Dafür kommt der Java-Compiler mit Fällen zurecht, wo bisher eine Deklaration nahezu unmöglich war:

var customerOrderGroups =
   from(customerList)
   .select(c -> tuple(
       c.companyName(),
       from(c.orders())
           .groupBy(o -> o.orderDate().year())
           .select(into((year, orders) -> tuple(
               year,
               from(orders)
                   .groupBy(o -> o.orderDate().month())
           )))
   ));

Dieses und weitere komplexe Beispiele sind in diesem lesenswerten Blogbeitrag beschrieben.

Sonstige Neuerungen

Erwähnenswert sind auch die beiden folgenden Neuerungen:

  • Es gibt eine neue Schnittstelle zum Garbage Collector: JEP 304
  • Das Root Zertifikat für das JDK ist öffentlich verfügbar, was die Unterschiede zwischen dem Oracle JDK und dem OpenJDK weiter minimiert: JEP 319

Die vollständige Liste aller neuen Features finden Sie hier.

Kompatibilität

Java 10 verspricht kompatibel zu Java 9 zu sein. Für umfangreiche Kompatibilitätstests fehlte mir die Zeit. Stichprobenartige Tests mit den Beispielprogrammen aus meinem Java-Buch verliefen aber problemlos.

Versionsnummer

Lange Zeit war unklar, ob die neue Java-Version nun Java 10 oder Java 18.3 heißen soll. Man hat sich letztlich für beides entschieden: Nach außen hin wird Java 11 kommuniziert, java -version zeigt aber auch 18.3:

java -version

  java version "10" 2018-03-20
  Java(TM) SE Runtime Environment 18.3 (build 10+46)
  Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

Java 10 und die IntelliJ IDEA

Die noch aktuelle IntelliJ-IDEA-Version 2017.3.4 unterstützt Java 10 nicht bzw. nur eingeschränkt (siehe hier).

Um die neuen Java-Features auszuprobieren, sollten Sie daher Version 2018.1 installieren. Der Release Candidate 2 kann aktuell hier heruntergeladen werden. Nach der Installation richten Sie die JDK 10 ein (File/New Project, Button New rechts oben im Dialog, JDK-Installationspfad auswählen). Schließlich müssen Sie bei den Projekteigenschaften (File/Projekt Structure) die JDK 10 und das Language Level 10 einstellen. Danach können Sie Local-Variable Type Inference ausprobieren.

IntelliJ IDEA 2018.1 RC2
Projekteinstellungen für Java 10
Hello World in Java 10

OpenJDK 10 unter Linux

Der beschleunigte Java-Release-Zyklus bringt Linux-Distributoren in Verlegenheit. Ubuntu will in Version 18.04 offensichtlich die OpenJDK 10 ausliefern und dann ein Update auf OpenJDK 11 durchführen (Quelle, mehr Details). In der aktuellen Beta von Ubuntu 18.04 verweist das Paket default-jdk (Paketquelle main) noch auf OpenJDK 8. Eine Testversion von OpenJDK 10 steht aktuell nur in der Paketquelle universe zur Verfügung (Paketname openjdk-10-jdk). Ob sich das bis zum Release in einem Monat noch ändern wird, erscheint fraglich — eigentlich gilt bereits ein Feature Freeze.

Support-Zeiträume für verschiedene Ubuntu- und OpenJDK-Versionen, Quelle: https://time.graphics/line/39488

Ein Blick auf Java 11

In Java 11 soll JavaFX aus dem JDK entfernt werden. Offiziell wird das als Fortschritt verkauft (JavaFX kann losgelöst vom Java-Release-Rhythmus weiterentwickelt werden), de facto klingt es aber eher nach dem Anfang vom Ende.

Quellen und Links

IntelliJ

Java 11