Suche
Für das Plus an Syntax

JEP 213 & JEP 277: Syntaxerweiterungen für Java 9

Michael Inden

© Shutterstock.com / Profit_Image

Das kürzlich erschienene Java 9 besteht aus mehr als nur Modulen und dem Projekt Jigsaw. Über 90 sogenannte JEPs (JDK Enhancement Proposals) sind Teil von Version 9 des Java Development Kits. In diesem ersten Teil seiner Serie zu Java 9 stellt Michael Inden, Oracle-zertifizierter Java-Entwickler, einige mit JDK 9 eingeführte Syntaxerweiterungen vor.

Die vorliegende Artikelserie zu Java 9 setzt sich aus Texten von Michael Indens Buch „Java 9 – Die Neuerungen“ zusammen, das beim dpunkt.verlag erschienen ist.

PS: Verpassen Sie nicht unsere Infografik zu Project Jigsaw!

Milling Project Coin (JEP 213)

Bereits in JDK 7 wurden unter dem Projektnamen Coin verschiedene kleinere Syntaxerweiterungen in Java integriert. Für JDK 9 gab es ein Nachfolgeprojekt, dessen wichtigste Neuerungen wir uns jetzt anschauen.

Anonyme innere Klassen und der Diamond Operator

Bei der Definition anonymer innerer Klassen konnte man den Diamond Operator bis JDK 8 leider nicht nutzen, stattdessen war der Typ aus der Deklaration auch bei der Definition explizit anzugeben. Praktischerweise ist es mit JDK 9 (endlich) möglich, auf die Typangaben zu verzichten, und somit den Diamond Operator zu verwenden, wie wir dies von anderen Variablendefinitionen bereits gewohnt sind. Als Beispiel dient die Definition eines Komparators mit dem Interface java.util.Comparator<T>:

final Comparator<String> byLength = new Comparator<>()
{
    ...
};

Private Methoden in Interfaces

Allgemein bekannt ist, dass Interfaces der Definition von Schnittstellen dienen. Leider verlieren Interfaces in Java immer mehr von ihrer eigentlichen Bedeutung, vor allem weil mit JDK 8 statische Methoden und Defaultmethoden in Interfaces erlaubt wurden, mit denen man Implementierungen vorgeben kann. Das führt jedoch dazu, dass sich Interfaces kaum mehr von einer abstrakten Klasse unterscheiden. Mit JDK 9 wurde der Unterschied zwischen Interfaces und abstrakten Klassen nochmals verringert, weil nun auch die Definition privater Methoden in Interfaces erlaubt ist. Dies sei beispielhaft im nachfolgenden Listing in Form der privaten Methode myPrivateCalcSum(int,int) gezeigt.

public interface PrivateMethodsExample
{
    // Tatsächliche Schnittstellendefinition - public abstract ist optional
    public abstract int method1();
    public abstract String method2();

    public default int sum(final String num1, final String num2)
    {
        final int value1 = Integer.parseInt(num1);
        final int value2 = Integer.parseInt(num2);

        return myPrivateCalcSum(value1, value2);
    }

    public default int sum(final int value1, final int value2)
    {
        return myPrivateCalcSum(value1, value2);
    }

    // Neu und unschön in JDK 9
    private int myPrivateCalcSum(final int value1, final int value2)
    {
        return value1 + value2;
    }
}

Lesen Sie auch: Java 9 ist da! Project Jigsaw & die neuen Features auf einen Blick

Tipp: Kommentar

Vielleicht fragen Sie sich, warum ich den privaten Methoden in Interfaces so ablehnend gegenüberstehe. Tatsächlich wurde die Büchse der Pandora bereits mit JDK 8 und den Defaultmethoden geöffnet. Die privaten Methoden mögen für Framework-Entwickler mitunter praktisch sein, jedoch besteht die Gefahr, dass sie für „normale“ Entwickler noch attraktiver werden und von diesen somit ohne großes Hinterfragen zur Applikationsentwicklung eingesetzt werden. Das wäre im Hinblick auf das Design und die Klarheit von Business-Applikationen ein Schritt in die falsche Richtung. Dadurch wird unter Umständen dem Schnittstellenentwurf weniger Aufmerksamkeit gewidmet, basierend auf der Annahme, dass benötigte Funktionalität immer noch nachträglich hinzugefügt werden kann.

Verbotener Bezeichner _

Bei den Bezeichnern gibt es eine kleine Änderung: Der Compiler erlaubt mit JDK 9 das Zeichen _ (Unterstrich) nicht mehr als Bezeichner. Während folgende Zeile mit JDK 8 noch kompilierte

final String _ = "Underline";,

produziert der Java-Compiler mit JDK 9 folgende Fehlermeldung:

as of release 9, ’_’ is a keyword, and may not be used as an identifier

Nutzung von „effectively final“-Variablen im ARM

Das mit JDK 7 eingeführte Automatic Resource Management (ARM) erleichtert die Arbeit mit und die Freigabe von Ressourcen bzw. der korrespondierenden Ressourcenvariablen. Mit JDK 9 gibt es eine Vereinfachung: Sofern eine Ressourcenvariable bereits außerhalb des ARM-Blocks definiert ist, kann diese direkt im try-Block von ARM verwendet werden. Dadurch wird der Sourcecode ein wenig kürzer und man vermeidet die erneute Definition einer Variablen:

final BufferedInputStream bufferedIs = ...;
BufferedOutputStream bufferedOs = ...;

try (bufferedIs;
    bufferedOs)
{
    // ....
}

Erweiterung der @Deprecated-Annotation (JEP 277)

Die @Deprecated-Annotation dient zum Markieren von obsoletem Sourcecode und besaß bislang keine Parameter. Das ändert sich mit JDK 9: Die @Deprecated-Annotation wurde um die zwei Parameter since und forRemoval erweitert. Das ist hilfreich, weil in Zukunft geplant ist, veraltete Funktionalität aus dem JDK zu entfernen, statt sie – wie bislang für Java üblich – aus Rückwärtskompatibilitätsgründen beizubehalten. Das folgende Beispiel zeigt eine Anwendung, wie sie aus dem JDK stammen könnte:

@Deprecated(since = "1.5", forRemoval = true)

Mithilfe der neuen Parameter kann man für veralteten Sourcecode angeben, in welcher Version (since) dieser mit der Markierung @Deprecated versehen wurde und ob der Wunsch besteht, die markierten Sourcecode-Teile in zukünftigen Versionen zu entfernen (forRemoval). Weil beide Parameter Defaultwerte besitzen (since = "" und forRemoval = false), können die Angaben jeweils für sich alleine stehen oder ganz entfallen. Diese Erweiterung der @Deprecated-Annotation kann man selbstverständlich auch für eigenen Sourcecode nutzen und so anzeigen, dass gewisse Funktionalitäten für die Zukunft nicht mehr angeboten werden sollen.

Java 9 – Die Neuerungen

Michael Indens Buch bietet einen fundierten Einstieg in Java 9 sowie einen Überblick über die umfangreichen Neuerungen in der aktuellen Version. Damit eignet sich das Buch für all jene, die ihr Java-Wissen aktualisieren wollen. Dabei helfen eine Vielzahl an Übungen, um die einzelnen Themengebiete zu vertiefen und besser zu verstehen.

Neben Änderungen an der Sprache bilden auch die Erweiterungen in diversen APIs einen Schwerpunkt. Fehlen darf hier natürlich auch nicht ein Kapitel über die fundamentalste Änderung in Java 9: Project Jigsaw. Auch fortgeschrittenere Themen wie Services und die Migration bestehender Applikationen werden besprochen. Da Java 9 auch einige Auswirkungen auf Build Tools und IDEs mit sich bringt, gibt ein Kapitel einen Überblick über den derzeitigen Stand zum Tooling rund um die neue Java-Version.

Weitere Informationenen zum Buch gibt es hier!

Verwandte Themen:

Geschrieben von
Michael Inden
Michael Inden
Dipl.-Inform. Michael Inden ist Oracle-zertifizierter Java-Entwickler für JDK 6. Nach seinem Studium in Oldenburg war er lange Zeit als Softwareentwickler und -architekt bei verschiedenen internationalen Firmen tätig und arbeitet derzeit als Teamleiter Softwareentwicklung in Zürich. Michael Inden hat rund 20 Jahre Erfahrung beim Entwurf komplexer Softwaresysteme gesammelt, an diversen Fortbildungen und an mehreren Java-One-Konferenzen in San Francisco teilgenommen. Sein Wissen gibt er gerne als Trainer in Schulungen und auf Konferenzen weiter. Sein besonderes Interesse gilt dem Design qualitativ hochwertiger Applikationen mit ergonomischen, grafischen Oberflächen sowie dem Coaching von Kollegen.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.