Closures werden nicht in Java 7 integriert sein

Zu früh gefreut: Java 7 ohne Closures

Markus Stäuble

Bei einer neuen Version von Java ist die spannendste Frage für die Entwicklergemeinde, welche Änderungen an der Sprache selbst vorgenommen werden. Die größte Sprachänderung wurde zuletzt mit Java 5 vollzogen. Hier kamen etliche Veränderungen wie Generics und Annotations hinzu. Das kommende Java 7 ist vor allem durch das Thema Closures geprägt. Nachdem nun schon vieles über Closures berichtet wurde, hat Mark Reinhold verkündet, dass Closures nicht in Java 7 enthalten sein werden.

Closures sind ursprünglich ein Konzept aus der funktionalen Programmierung, das z. B. in der Programmiersprache Scheme umgesetzt ist. Längst gibt es aber vermehrte Bewegungen, Konzepte der funktionalen Sprachen in die objektorientierte Welt von Java einzubringen. Dies trifft auch auf das Konzept der Closures zu. Zusammengefasst wird mit Closures die Möglichkeit adressiert, dass auch Funktionen als Parameter von Methoden verwendet werden können. Bisher bietet Java hierfür nur die anonymen Klassen an. Bei Sprachänderungen ist neben der Notwendigkeit die Syntax ein viel diskutiertes Thema. Für Closures gibt es drei Vorschläge: BGGA, CICE und FCM. BGGA ist die Abkürzung für Bracha, Gafter, Gosling und Ahe. Dies sind die Autoren des Vorschlags. CICE steht für Concise Instance Creation Expressions und ist von Bob Lee, Doug Lea und Josh Bloch entworfen. FCM steht für First Class Methods und ist von Stephen Colebourne und Stefan Schulz. Für alle drei Varianten stehen Implementierungen zur Verfügung. Derzeit zeichnet sich ab, dass sich BGGA durchsetzen wird. Deshalb wird dies nachfolgend kurz dargestellt.

BGGA – So wird es wahrscheinlich aussehen

Um ein erstes Gefühl für Closures im Quellcode zu vermitteln, werden einige kurze Beispiele zur Veranschaulichung dargestellt. In Listing 1 ist die allgemeine Schreibweise von Closures nach BGGA aufgeführt. An dieser Darstellung ist zu erkennen, dass ein Closure einen Block-Java-Code repräsentiert.

{ formal parameters => statements expression }

Wie so oft, soll zur Erklärung der Closures das altbekannte „Hallo Welt“-Beispiel verwendet werden. In Listing 2 ist zunächst die Methode auf herkömmlichem Weg dargestellt.

void sayHello() {
  System.out.printn("Hallo Welt");
}

Ein Closure wird über die Methode invoke ausgeführt, wie in Listing 3 zu erkennen ist. Für die Ausgabe des Textes „Hallo Welt“ wird kein Parameter benötigt. Deshalb ist die linke Seite von => leer.

public static void main( String[] args ) {
  { => System.out.println("Hallo Welt"); }.invoke();
}

Wie bei herkömmlichen Methoden können auch Closures mit Parametern versorgt werden. Die Trennung der einzelnen Parameter (auf der linken Seite von =>) erfolgt mittels Komma (Listing 4).

public static void main( String[] args ) {
  System.out.println( { int a, int b => (a + b) }.invoke( 10, 20) );  // 30
}

In Listing 5 ist ein Beispiel aufgeführt, in dem ein Closure an eine Variable übergeben wird.

{ int, int => int } addMethod = { int a, int b => (a + b) }
System.out.println( addMethod.invoke( 10, 20 ) );   // 30

Listing 6 zeigt die Definition einer Methode (loopMethod) mit einem Closure als Parameter.

public class ClosureSample {
  public static void loopMethod( int times, { => void } theMethod ) {
    for ( int i = 0; i  System.out.println("Hallo Welt"); } );
 }
}

Es wurden hier nur die wichtigsten Elemente des BGGA-Konzepts aufgezeigt. Eine ausführliche Darstellung finden Sie hier. Es ist zu unterstreichen, dass sich bis zu einer finalen Version noch Änderungen ergeben können.

Stabilität besiegt Dynamik

Das Thema Closures war im vergangenen Jahr eines der beherrschenden Themen, und viele Entwickler haben sich bereits damit auseinandergesetzt. Mark Reinhold hat auf der diesjährigen Devoxx über den Funktionsumfang von Java 7 berichtet. Die größte Änderung, nämlich Closures, wird aber verschoben. Dies hat doch sehr überrascht, besonders da die Entwürfe schon weit fortgeschritten sind. Die Reaktionen zu dieser Ankündigung waren sehr kontrovers, gehen sogar bis zur Vermutung, dass hiermit das Ende von Java eingeläutet wird. Da es sich bei Closures um eine enorme Änderung von Java handelt, ist es vielleicht sogar hilfreich, wenn die Vorschläge nochmals konsolidiert werden. Mark Reinhold hat übrigens neben dem Funktionsumfang auch einen Erscheinungszeitraum für Java 7 genannt, Anfang 2010.

Als Fazit dieser Entscheidung muss man aber trotzdem festhalten, dass in diesem Fall die Stabilität von Java gegenüber der Dynamik von Änderungen gesiegt hat. Hier zeigt sich einmal mehr, dass Java erwachsen und auch längst im Business angekommen ist.

Markus Stäuble ist CTO (Head of Technology) bei namics (deutschland) GmbH, einem führenden IT- und Webdienstleister. Darüber hinaus ist er freier Autor von Fachartikeln.

Geschrieben von
Markus Stäuble
Kommentare

Schreibe einen Kommentar

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