Java 7: The Big Update

Type Annotations

Java 8 wird die so genannten „Type Annotations“ unterstützen. Dabei handelt es sich um eine Änderung an der Sprache, die die Verwendung von Annotationen an deutlich mehr Stellen erlaubt, als es bisher der Fall war. Bislang war die Verwendung von Annotationen im Quellcode beschränkt. Es konnten lediglich Packages, Typen, Methoden und Konstruktoren, Felder, lokale Variablen, Methodenparameter und Enumeratoren annotiert werden. In Java 8 wird es erlaubt sein, Annotationen überall dort zu verwenden, wo Typen erlaubt sind. Zum Beispiel darf man dann Konstrukte wie


Map60@NonNull String, @NonEmpty List60@Readonly Document>> files;

@NonNull Object @Nullable [] array;

schreiben, was bislang syntaktisch unzulässig ist, weil weder zu den Typparametern in generischen Typen noch zum Elementtyp von Arrays Annotationen hinzugefügt werden dürfen.

Das Ziel dieser Spracherweiterung ist es, die Annotationen ganz generell als Typqualifikatoren verwenden zu können. Mithilfe der Annotationen kann in Java 8 das Typsystem der Sprache Java erweitert werden – ohne die Sprache ändern zu müssen – indem man Typen mithilfe von Annotationen näher beschreiben kann. Diese Änderung der Java-Syntax wurde im JSR 308 [9] beschrieben, der zwar bislang nicht formal verabschiedet wurde, aber in Java 8 implementiert werden soll.

Wozu braucht man das? Ohne Werkzeuge, die diese neuen Möglichkeiten nutzen, machen die Typannotationen keinen Sinn. Deshalb werden begleitend zu den beschriebenen Sprachänderungen statische Analysewerkzeuge entwickelt, die anhand bestimmter Annotationen Fehler im Quellcode aufzuspüren [9]. Ein Beispiel für solche Annotationen sind @NonNull und @Nullable. Die betreffenden Werkzeuge sollen verhindern, dass einer @NonNull-Variablen (die nicht null werden darf) der Wert null zugewiesen wird oder dass eine @Nullable-Variable (die den Wert null haben könnte) ohne Prüfung auf != null dereferenziert wird. Diese Werkzeuge werden aber nicht Bestandteil von Java 8 sein, sondern Add-ons, die man zusätzlich herunterladen und verwenden kann.

Project Lambda

Beim „Project Lambda“ (vormals „Closures“) geht es um ein neues Sprachmittel in Java, das aus funktionalen Programmiersprachen stammt. Wenn man heutzutage in Java eine Funktionalität formulieren und als Parameter übergeben möchte, dann muss man ein Interface definieren und eine Klasse, die das Interface implementiert. Beispiel: Wenn man eine Funktionalität asynchron in einem anderen Thread ausführen will, muss man eine Klasse schreiben, die das Interface Runnable mit seiner run()-Methode implementiert, in der run()-Methode wird die eigentliche Funktionalität formuliert, dann wird ein Objekt von neuen Typ alloziert und einem Thread oder Thread-Pool zur Ausführung übergeben. Eigentlich geht es aber nur um das, was die run()-Methode tut. Der syntaktische Überbau für das Runnable-Interface, die implementierende Klasse und die Objektkonstruktion ist eigentlich komplett überflüssig. Ähnliche Situationen findet man bei der Implementierung von Callbacks oder Listener Interfaces oder ganz allgemein bei Interfaces mit nur einer Methode. Um die Syntax zu vereinfachen, soll es Lambda-Ausdrücke geben. Anstelle von


new Thread(new Runnable { public void run() { System.out.println („Hello World!“); } }).start();

würde man lediglich sagen

new Thread( #{ System.out.println („Hello World!“) ).start();

Der mit „#“ eingeleitete Ausdruck wäre das Lambda und beschreibt nur noch das Wesentliche, nämlich die Funktionalität. Das ist eine sehr vereinfachte Darstellung von Lambdas. Im Zusammenhang mit diesem neuen Sprachmittel ist noch weit mehr diskutiert worden und es wird auch noch immer diskutiert über die Syntax und die Mächtigkeit des Sprachmittels. Inspiriert sind die Lambdas von entsprechenden Konstrukten in funktionalen Programmiersprachen, die insbesondere durch neue hybride Sprachen wie Scala und Skriptsprachen wie Groovy populär geworden sind.

Das Sprachmittel der Lambdas ist in den Jahren 2006 bis 2008 sehr heftig diskutiert worden und es gab gleich drei konkurrierende Vorschläge dafür [10], damals noch unter der Bezeichnung „Closures“. Wegen des kontroversen Ansatzes der verschiedenen Vorschläge stagnierte das Thema für mehr als ein Jahr und es sah zunächst so aus, als wären Lambdas/Closures für Java gar kein Thema mehr. Im November 2009 wurde die Idee wieder aufgegriffen und in Java 8 sollen Lambdas dann verfügbar sein [11].

Lambda-Ausdrücke werden u. a. für die ParallelArrays gebraucht, die ebenfalls mit Java 8 freigegeben werden sollen. Die ParallelArrays sind ein Framework, dem man nur noch sagen muss, welche Funktionalität auf jedes einzelne Array-Element angewandt werden soll, und das dann für die parallele Ausführung sorgt. Die Lambdas würden die Benutzung der ParallelArrays drastisch vereinfachen, denn den syntaktischen Überbau für die Beschreibung der Funktionalität in Form von Interfaces und implementierenden Klassen könnte man mit Lambdas komplett eliminieren.

Zusammenfassung

In diesem Beitrag haben wir eine Übersicht über die neuen und geplanten Sprachmittel und JDK-Erweiterungen in Java 7 und Java 8 gegeben. In den folgenden Beiträgen werden wir einige der Neuerungen näher diskutieren.

Angelika Langer arbeitet selbstständig als Trainer mit einem eigenen Curriculum von Java- und C++-Kursen. Kontakt: http://www.AngelikaLanger.com.

Klaus Kreft arbeitet als Entwickler und Consultant, derzeit für SEN (Siemens Enterprise Communications GmbH & Co. KG). Kontakt: klaus.kreft[at]siemens-enterprise.com.

Kommentare

Schreibe einen Kommentar

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