[Java] Java 9 erschienen

Am 21.09.2017 ist nach langem hin und her endlich Java 9 erschienen.

3 Jahre wurde damit an Java 9 gearbeitet, 92 JEPs (JDK Enhancement Proposals), also 92 Features / Verbesserungen wurden hinzugefügt.

So viele Änderungen, dass es leider annähernd unmöglich ist, auf alle diese einzugehen. Deshalb konzentriere ich mich hier nur auf die wichtigsten Änderungen.

Außerdem ändern sich die Entwicklungszyklen. Gibt es jetzt kein Java 10 mehr?

Was ändert sich jetzt für uns konkret? Dem wollen wir in diesem Artikel auf den Grund gehen.

 

Java Logo

Java Logo

 

Änderungen & Inkompatibilitäten

In Java 9 hat sich eine ganze Menge geändert, aber es wird immer nur Jigsaw, das neue Modulsystem von Java, erwähnt.

Aber wollen wir doch erstmal mit den anderen Sachen anfangen. Vorerst: Es ist möglich, dass eure Java 8 Applikation nicht mehr unter Java 9 läuft.

Dies kann mehrere Gründe haben, z.B. dass eure Applikation interne Apis (z.B. sun.misc.Unsafe) verwendet oder dass einige alte Klassen entfernt wurden.

Eine Liste aller Klassen, die hinzugefügt, geändert oder gelöscht wurden, findet ihr hier:

https://gunnarmorling.github.io/jdkapidiff/jdk8-jdk9-api-diff.html

 

Wie man aus dieser Liste entnehmen kann, wurden ganz viele JavaFX Klassen (Builder) entfernt:

Java 9 erschienen - Änderungen

Java 9 erschienen – Änderungen

 

Anwendungen, welche diese Klassen benutzen (die meisten sind protected, aber manche nutzen ja Reflection), werden nicht mit Java 9 kompatibel sein.

Allerdings sollte das eine Ausnahmen darstellen.

 

Der wichtigste Punkt ist aber das Verstecken der internen Apis, wie sun.misc.Unsafe. Viele Libraries verwenden sun.misc.Unsafe, um nativen Speicher zu alloziieren, der nicht vom Garbage Collector (GC) verwaltet wird. Allerdings hat Oracle eingehackt und per Default sind diese internen Apis noch in Java 9 verfügbar, werden aber in der nächsten Java Version entfernt.

 

Erweiterte Stream-Api

Die Stream-Api von Java hat neue Methoden bekommen, die das Handling vereinfachen sollen.

Die Methode takeWhile(Predicate<? super T> predicate) erzeugt einen neuen Stream und fügt dabei so lange Elemente hinzu, bis eines das Predicate nicht erfüllt.

dropWhile(Predicate<? super T> predicate) dagegen funktioniert was umgedreht: Diese Methode entfernt so lange Elemente, wie sie nicht das Predicate erfüllen. Somit startet der neue Stream mit dem ersten Element, welches das Predicate nicht erfüllt. Außerdem wurde die iterate-Methode überladen und funktioniert jetzt ähnlich wie eine for-Schleife:

 

Einfachere Listen- & Map-Erzeugung

Es ist jetzt einfacher, immutable (unveränderbare) Listen zu erzeugen. Hierfür wurde eine neue Methode hinzugefügt:

 

Für das Interface Set gilt das selbe. Auch das Interface Map besitzt solch eine Methode, mit welcher man eine unveränderliche Map mit maximal 10 Einträgen erstellen kann:

 

Erweiterte Process-Api

Mit der Process-Api ist es möglich, Programme auf Betriebssystem-Ebene zu starten / stoppen usw.

Beispiel um den Windows Editor zu starten:

 

Das Starten von Prozessen war also kein Problem, aber wenn man z.B. alle Prozesse des Betriebsystems auslesen wollte, war dies sehr schwierig.

Seit Java 9 ist dies jetzt ein 1-Zeiler:

Dazu werde ich allerdings nochmal einen extra Blog Artikel verfassen.

 

Neuer HTTP/2 Client

Wenn man früher den Quelltext einer Webseite auslesen wollte, war dies recht umständlich:

 

Seit Java 9 geht das einfacher:

 

Außerdem funktioniert dieser neue HTTP/2 Client auch asynchron, allerdings würde dies den Rahmen sprengen, wenn ich hierauf näher eingehen würde.

Falls es euch interessiert, schreibt es doch in die Kommentare! 🙂

 

Projekt Jigsaw

Ursprünglich sollte das neue Modulsystem von Java – Projekt Jigsaw – bereits in Java 8 kommen, aber Jigsaw war so umstritten, dass es um ein Haar sogar aus Java 9 geflogen wäre. Oracle hat aber nachgebessert, sodass das Java Executive Committee (Java EC) die Änderung doch noch durchgewunken hat. Jigsaw ist die größte Änderung in Java 9.

Die Software kann jetzt in einzelne Module unterteilt und der Zugriff verboten oder erlaubt werden. Somit kann eine stärkere Abkappselung, damit eine bessere Wartbarkeit und demzufolge auch weniger technische Schulden erzielt werden.

Außerdem können Abhängigkeiten definiert werden.

Beispiel für eine module-info.java (Modul-Definition):

Zu Jigsaw werde ich ebenfalls nochmal ein größeres Tutorial schreiben. 🙂

 

Neue Versionsnummern & Entwicklungszyklen

Mark Reinhold, der Chief Architect of the Java Platform Group bei Oracle hat am 06.09.2017 in seinem Blog vorgeschlagen, einen neuen Entwicklungszyklus zu verwenden.

Dazu hat er folgendes kritisiert:

 

“For over twenty years the Java SE Platform and the JDK have evolved in large, irregular, and somewhat unpredictable steps. Each feature release has been driven by one or a few significant features, and so the schedule of each release has been adjusted as needed — sometimes more than once! — in order to accommodate the development of those features.

This approach made it possible to deliver big new features at a high level of quality, after thorough review and testing by early adopters. The downside, however, was that smaller API, language, and JVM features could only be delivered when the big features were ready.”

Quelle: https://mreinhold.org/blog/forward-faster

 

Marks Ziel ist es, neue Java Version deutlich schneller herauszubringen.

Alle 6 Monate soll ein Feature Release und alle 3 Monate ein Update Release folgen.

Außerdem soll alle 3 Jahre ein long-term Support (LTS) Release mit größeren Update Zeiträumen folgen, was vermutlich gerade für größere Firmen interessant sein könnte.

Wenn dies so umgesetzt wird, kommt die nächste Java Version bereits im März raus und wird nicht Java 9, sondern Java 18.3 heißen.

 

An der neuen Version wird übrigens schon gearbeitet:

http://hg.openjdk.java.net/jdk10/master

 

Weiterführende Literatur & Quellen

Schreibe einen Kommentar

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