/Java 9 ist fertig

Java 9 ist fertig

Oracle hat nach mehrfachen Verschiebungen die finale Version des JDK 9 veröffentlicht. Neben dem viel diskutierten Modulsystem hat es zahlreiche weitere Neuerungen wie die JShell und eine erweiterte Stream-API zu bieten.

Nachdem die Entwicklung der neuen Java-Version bereits 2014 mit den Vorschlägen der ersten JDK Enhancement Proposals (JEPs) begonnen hatte, ist es nun nach über dreijähriger Entwicklung endlich soweit: Das JDK 9 liegt in der finalen Version vor. Es umfasst 92 JEPs, die jeweils kleinere oder größere Änderungen spezifizieren. Eine vollständige Liste aller JEPs lässt sich der Webseite des JDK9 entnehmen.

Ursprünglich sollte Projekt Jigsaw bereits Bestandteil von Java 8 sein. Die Modularisierung der Java-Plattform gestaltete sich jedoch kompliziert und wurde nach Java 9 verschoben. Auch hier war das Projekt für einige Verzögerungen im Zeitplan verantwortlich. Vor allem die Auswirkungen der Modularisierung auf bestehende Anwendungen sorgte für viele Diskussionen und eine Ablehnung im ersten Public Review Ballot durch das Executive Committee (EC) des JCP.

Das führte zu einer deutlichen Aufweichung der Modulkapselung, sodass sich vorerst auch bestehende Anwendungen ohne größere Anpassungen ausführen lassen. Dieses Vorgehen soll eine inkrementelle Migration bestehender Anwendungen ermöglichen und somit den Umstieg auf Java 9 erleichtern. Nach den Anpassungen erhielt das Projekt im Juni die erforderliche Zustimmung im zweiten Public Review Ballot.

Mittelfristig wird eine Migration bestehender Anwendungen jedoch trotzdem erforderlich sein, da die vereinfachten Zugriffsregeln in späteren Releases wieder verschwinden sollen. Zu den dabei auftretenden Fehlermeldungen und deren Behebung gibt es bereits einige detaillierte Artikel.

Neben Projekt Jigsaw enthält Java 9 noch viele weitere Änderungen. Eine davon ist die Erweiterung der Stream-API. Das StreamInterface verfügt in Java 9 über zusätzliche Methoden, die die Implementierung gängiger Aufgaben vereinfachen.

Mit den neuen Methoden takeWhile(Predicate<? super T> predicate) und dropWhile(Predicate<? super T> predicate) lässt sich nun ein Predicate auf die ersten Elemente eines geordneten Streams anwenden und dadurch ein neuer Stream erzeugen. Die takeWhile-Methode fügt dabei so lange Elemente zum Stream hinzu, bis eines das Predicate nicht erfüllt wird. Die dropWhile-Methode hingegen entfernt so lange Elemente, wie sie nicht dem Predicate gerecht werden. Der erzeugte Stream startet somit mit dem ersten Element des ursprünglichen Streams, das das Predicate nicht erfüllt.

Des Weiteren wurde die iterate-Methode mit neuen Parametern überladen, mit denen sich ein Abbruchkriterium für das Erzeugen des Streams definieren lässt:

Stream.iterate(1, i -> i <= 50, i -> 10 * i).forEach(System.out::println);

Das daraus entstehende Verhalten ähnelt der bereits bekannten for-Schleife. Der Stream beginnt mit dem seed-Element, in diesem Fall 1, sofern es das Predicate, in diesem Beispiel <= 50, erfüllt. Anschließend wird mit Hilfe des next-Operator, hier 10*i, das nächste Element erzeugt. Das geht so lange weiter, bis das neu erzeugte Element das Predicate nicht mehr erfüllt.

Außerdem enthält das Stream-Interface die neue Methode ofNullable(T t), die einen neuen Stream aus dem übergebenen Objekt erzeugt, wenn dieses nicht null ist. Bei der Übergabe von null erzeugt die Methode einen leeren Stream.

Auch das OptionalInterface wurde um ein paar nützliche zusätzliche Methoden ergänzt. Hier sind vor allem stream() und or(Supplier<? extends Optional<? extends T>> supplier) zu nennen. Erstere erzeugt einen Stream, wenn das Optional einen Wert enthält und einen leeren Stream, wenn das Optional einen null-Wert enthält. Somit lässt sich aus einem Stream<Optional<T>> ein Stream<T> erzeugen. Die or-Methode ermöglicht das Erstellen eines neuen Optional, falls das aktuelle Optional einen null-Wert enthält:

Optional<Book> b = books.findBook(title).or(() -> books.createBook(title));

Eine weitere kleine, aber interessante Ergänzung ist die neue Kommandozeilenanwendung JShell. Mit ihr können Entwickler nach dem REPL-Prinzip (Read-Eval-Print Loop) Java-Ausdrücke ausführen. Das soll unter anderem das Erstellen von Prototypen und das Erlernen der Programmiersprache erleichtern:

-> System.out.println("Hello, world!") 
Hello, world!

Neben der Kommandozeilenanwendung steht auch eine API zur Verfügung, mit der andere Anwendungen JShell verwenden können.

JEP 269 erweitert die Collection-Interfaces um zusätzliche Factory-Methoden, was das Erstellen kleiner, unveränderlicher Collections deutlich vereinfacht.

Mit Hilfe der of-Methode lässt sich nun beispielsweise eine immutable List von Elementen erzeugen:

List<String> list = List.of("String A", "String B", "String C");

Dieselbe Methode steht ebenfalls auf dem Set-Interface zur Verfügung. Dabei ist zu beachten, dass es keine null-Werte unterstützt und die Reihenfolge der Elemente innerhalb des Sets nicht definiert ist:

Set<String> set = Set.of("String A", "String B", "String C");

Vergleichbare Methoden haben die Macher auch dem Map-Interface hinzugefügt. Hier können Entwickler nun mit der of-Methode eine unveränderliche Map mit bis zu zehn Schlüssel-Wert-Paaren erzeugen:

Map<String, Integer> map = 
Map.of(„String A“, 1, “String B”, 2, “String C”, 3);

Wer eine Map mit mehr Elementen benötigt, kann sie mit Hilfe der ofEntries(Map.Entry<? extends K,? extends V>… entries) erstellen:

Map<String, Integer> map = 
Map.ofEntries(entry(“String A”, 1),
entry(„String B“, 2),
entry(“String C”, 3);

Das Release des JDK 9 bringt viele Änderungen und soll mit der Modularisierung den Grundstein für die Weiterentwicklung der Programmiersprache legen. In Zukunft soll diese Entwicklung in kleineren und deutlich schnelleren Schritten erfolgen. Die nachfolgenden Releases sollen im Abstand von 6 Monaten erscheinen.

Java 2017

Mehr Informationen zu Java 9, Java EE 8 und aktuellen Entwicklungen im Java-Umfeld gibt es in dem iX-Developer-Sonderheft, das unter anderem im heise Shop erhältlich ist.

Dabei passt Oracle auch die Supportzyklen an und unterscheidet beginnend mit JDK 9 zwischen Non-LTS- und LTS-Releases. Die meisten – einschließlich JDK9 – sind als Non-LTS-Releases eingestuft. Der Support dazu endet bereits nach sechs Monaten, sodass häufige Aktualisierungen erforderlich sind. Alle drei Jahre soll zusätzlich ein als LTS gekennzeichnetes Release erstellt werden, das wie die bisherigen JDK-Releases über mehrere Jahre betreut wird.

Zur Stunde feiert Oracle auf der Münchner Release-Party offiziell den Launch von Java 9; der Download war bisher noch nicht verfügbar.


(rme)