Java 11 steht seit Ende September 2018 zum Download bereit und stellt nach Java 8 wieder ein sogenanntes LTS-Release (Long Time Support) dar. Das ist insofern erfreulich, da hier einige Jahre Support und Updates angeboten werden, wohingegen Java 9 und 10 durch die neue Release-Politik von Oracle jeweils lediglich für eine kurze Zeitspanne von 6 Monaten aktuell waren und auch keine Updates mehr erhalten. In seiner neuen Serie zu Java 11 gibt Michael Inden einen Einblick in die Features der neuen Java-Version.
Michael Inden hat bereits die Highlights von Java 9 in seiner Artikelserie Java 9 – Eine Einführung vorgestellt, in der Serie Best of Java 10 ging er auf die Neuerungen in Java 10 ein. Die vorliegende Artikelserie setzt sich aus Texten zusammen, die auch Teil seines neuen Buches zu Java 10/11 sein werden, das beim dpunkt.verlag erscheinen wird.
Bevor wir beginnen, beachten Sie unbedingt den nachfolgenden Praxishinweis zur neuen Lizenzpolitik von Oracle. Während Java 10 eher Änderungen kosmetischer Natur bietet, stellt Java 11 im Gegensatz dazu glücklicherweise ein paar mehr Neuerungen in den APIs bereit – noch immer empfinde ich jedoch die Notwendigkeit der dafür verwendeten Major-Version als fragwürdig.
Sofern Sie planen, Ihre Software kommerziell zu vertreiben oder dies bereits tun, sollten Sie beim Herunterladen von Java 11 unbedingt die neue Release-Politik von Oracle beachten: Das bislang immer kostenfrei verwendbare Oracle JDK ist nun leider kostenpflichtig. Als Alternative können Sie auf das OpenJDK ausweichen. Während der Entwicklung kann das Oracle JDK allerdings weiterhin kostenfrei genutzt werden.
In Java 11 wurde eine kleine Anpassung bezüglich der Syntax vorgenommen: Man ist mit var
nicht nur auf lokale Variablen beschränkt, sondern kann var
nun auch zur Typangabe in Lambda-Ausdrücken verwenden. Das schauen wir uns nachfolgend etwas genauer an.
Bis einschließlich Java 10 konnte man in einem Lambda-Ausdruck entweder alle Typen angeben oder alle weglassen. Jedoch war dort die Verwendung von var
nicht möglich. Das wurde mit Java 11 geändert, sodass folgender Lambda-Ausdruck nun korrekt ist:
(var x, var y) -> x.doSomething(y)
Blicken wir kurz zurück – in Java 10 waren diese beiden Varianten erlaubt:
IntFunction<Integer> doubleItTyped = (final int x) -> x * 2;
IntFunction<Integer> doubleItNoType = x -> x * 2;
Nicht unterstützt wurde jedoch die Angabe von var
:
IntFunction<Integer> doubleItWithVar = (var x) -> x * 2;
Warum sollte denn diese Variante überhaupt nützlich sein, wo man doch vollständig auf die Typangabe verzichten kann? Eine berechtigte Frage! Die Antwort ergibt sich aus dem Wunsch, zwar keinen Typ explizit angeben zu müssen, jedoch etwa den Parameter trotzdem final definieren oder Annotationen hinzufügen zu können. Das geht natürlich nicht, wenn die Lambda-Variante vollständig ohne Typ genutzt wird. Hier erlaubt var
, auf die explizite Typangabe zu verzichten, jedoch weitergehende Informationen bereitstellen zu können. Das wird nachfolgend durch die Annotation @NonNull
verdeutlicht:
Function<String, String> trimmer = (@NonNull var str) -> str.trim();
Diese Anpassung in der Syntax ist zwar nur klein, aber fein, weil dadurch mehr Konsistenz erreicht wird sowie – wie bereits im Beispiel demonstriert – die Möglichkeiten zur Angabe zusätzlicher Infos zu einer Variablen möglich wird.
Im nächsten Teil der Serie geht es dann um die API-Neuerungen in Java 11!
Michael Indens Buch bietet eine umfassende Einführung in die professionelle Java-Entwicklung und vermittelt Ihnen das notwendige Wissen, um stabile und erweiterbare Softwaresysteme auf Java-SE-Basis zu bauen. Praxisnahe Beispiele helfen dabei, das Gelernte rasch umzusetzen. Neben der Praxis wird viel Wert auf das Verständnis zugrunde liegender Konzepte gelegt.
Die Neuauflage wurde durchgehend überarbeitet, aktualisiert und erweitert. Auch Java 9 sind zwei Kapitel gewidmet. Eine neue Auflage des Buches mit Erweiterungen für aktuellere Java-Versionen ist für den Sommer bzw. Herbst 2019 geplant.