News

Dienstag, 18. Mai 2010 | News

Neuer Oracle-Vorstoß in Sachen "Closures"

(Link zum Artikel: http://www.it-republik.de/jaxenter/news/055511)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Brian Goetz, Entwickler an Java 7 bei Oracle, hat sich nun in der Frage zu Wort gemeldet, ob Closures nun wirklich in JDK 7 integriert sein werden. Nachdem sich David Flanagan Ende letzter Woche über das Schweigen von Oracle zu dem Thema beklagt und die rechtzeitige Umsetzbarkeit in Frage gestellt hatte, antwortet Goetz nun mit einer offiziellen Stellungnahme, in der er neue Vorschläge für die technologische Lösung des Closure-Problems unterbreitet.

Goetz stellt die Problemlage zunächst folgendermaßen dar:

Habe man ein Java-Interface erst einmal veröffentlicht, sei es unmöglich, neue Methoden hinzuzufügen, ohne damit existierende Implementierungen zu beschädigen. Je länger eine Bibliothek schon veröffentlicht sei, desto wahrscheinlicher sei es, dass insbesondere bei der Einführung von Closures Probleme entstünden.

Doch Closures einzuführen, ohne auch Collection-Klassen so zu erweitern, damit sie von den Vorteilen von Closures profitieren (z.B. Methoden wie forEach, map, filter, reduce), würde von der Community als halbherzig und unzeitgemäß wahrgenommen.

The addition of closures to the Java language in JDK 7 place additional stress on the aging Collection interfaces; to add closures without extending the Collections classes to take better advantage of closures (e.g., methods like forEach, map, filter, reduce, etc) would be seen as anticlimactic by the community. Brian Goetz

Auch statische Erweiterungen könnten aufgrund diverser Limitierungen nicht die Lösung sein:

In general, static-ness is a source of all sorts of problems in Java, so adding more static mechanisms seems like a step in the wrong direction. Brian Goetz

Goetz schlägt zur Lösung des Problems die Einführung des Konzepts der "virtuellen Extension-Methoden" (Public defender methods) vor.

In this document, we propose adding a mechanism for adding new methods to existing interfaces, which could be called virtual extension methods. Existing interfaces could be added to without compromising backward compatibility by adding extension methods to the interface, whose declaration would contain instructions for finding the default implementation in the event that implementers do not provide one. Brian Goetz

Ein Beispiellisting - ein Set-Interface, das um eine virtuelle Extension-Methode erweitert wird - könnte dann wie folgt aussehen:

  1. public interface Set<T> extends Collection<T> {
  2. public int size();
  3. // The rest of the existing Set methods
  4. extension T reduce(Reducer<T> r)
  5. default Collections.<T>setReducer;
  6. }

Ziel der Einführung dieser Public-defender-Methoden sei es, Interfaces flexibler zu halten und für spätere Erweiterungen zu öffnen:

The intent of this feature is to render interfaces more malleable, allowing them to be extended over time by providing new methods so long as a default (which is restricted to using the public interface of the interface being extended) is provided. This addition to the language moves us a step towards interfaces being more like “mixins” or “traits”. However, developers may choose to start using this feature for new interfaces for reasons other than interface evolution. Brian Goetz

Ob diese Änderungen allerdings schon in JDK 7 enthalten sein werden, steht weiterhin in Frage. Goetz selbst erwähnt die Möglichkeit, zunächst Closures einzuführen und die beschriebenen Library-Änderungen in einem späteren Update oder in SE8 nachzuholen.

Ein PDF des Vorschlags steht hier zum Download bereit. Goetz hat indessen ein weiteres Dokument veröffentlicht, in dem er die Überstzung von Lambda-Ausdrücken nach javac beschreibt.

(hs)

Anzeige

Kommentare

Gravatar RPR 18.05.2010
um 19:34 Uhr
Er kann doch einfach ein zweites Interface einführen - meinetwegen "AdvancedSet" mit den o.g. Methoden, welches die konkreten "Collection-Classes" des JDK 7 dann eben zusätzlich implementieren...

Irgendwie scheint es mir, als ob neuerdings niemand mehr nachdenken würde, sondern für jedes Problemchen ein neues Sprachfeature einführen möchte ... ich glaub nicht, dass die extensions hier irgendwas an der Wurzel packen sondern einfach nur das Problem woanders hinschieben.
#zitieren
Gravatar Len 18.05.2010
um 23:52 Uhr
Also von Microsoft wurde das Problem schon erfolgreich mit Extension Methods gelöst, wobei ich Extension Methods nicht nur als Mittel zum Zweck betrachten würde, sondern als wirklich sinnvolles Feature. Ich denke die Java-Entwickler können froh sein, dass Oracle jetzt das Ruder in die Hand genommen hat, unter Sun wurde viel verpennt finde ich. Gerade Closures wurden vorher immer als überflüssig hingestellt, der nächste Schritt wären dann die Lambda-Ausdrücke um wieder einigermaßen mit C# und Co. auf Augenhöhe zu sein. #zitieren
Gravatar Trepper 19.05.2010
um 10:05 Uhr
Ich denke, man sollte von Java 7 nicht mehr allzu viel erwarten. Es wäre besser, mit Java 8 wirklich grundlegend die Sprache zu überarbeiten und die besten Ideen aus Scala zu übernehmen. Meiner Meinung nach ist es Zeit, einen Bruch zu wagen und nach 15 Jahren endlich mal alte Zöpfe (und alte Fehler) abzuschneiden. #zitieren
Gravatar Baldur 25.05.2010
um 04:40 Uhr
Das Problem bei einem zusätzlichen "AdvancedSet" wäre, daß jeglicher bisher geschriebener Code davon nicht mehr profitieren würde. Wenn eine Library, die für Java #zitieren
Gravatar RPR 26.05.2010
um 22:31 Uhr
> bisher geschriebener Code davon nicht mehr profitieren würde

Na und? Oder viel mehr gerade deswegen!
Eine Collection Klasse, die seit Jahren nicht mehr geupdatet wird: Da kann doch drauf gepfiffen werden; die braucht das halt nicht mehr. Und eine die geupdated wird: Die kann, ja muss(!!) sogar die neuen Interfaces auf ihre spezielle Art implementieren. Natürlich, denk doch mal einen Augenblick drüber nach!

Also wenn dieser Blödsinn mit den Extensions kommt, haben sie IMHO das assert um Faktor 100 getoppt.
Dieser Götz hat offenbar absolut null Plan, was Interfaces sind und versucht sie grad neu zu entdecken. *kopfschüttel*
Das einzig positive daran: Ich bin froh, dass ich nicht der arme Gosling bin, der sicher auch diese Sch... durchlesen muss (aus Berufungsgründen) und still zu weinen anfängt...
#zitieren
Gravatar Patrick 27.05.2010
um 16:07 Uhr
Ich halte dies für einen wichtigen Schritt in die FALSCHE Richtung. Gerade wenn ich die Vergleiche mit C# hier aufkommen sehe. Aufgrund meiner Erfahrung (auch aus dem C#-Umfeld) sind Extension-Methods sowie Lambda-Ausdrücke tickende Zeitbomben für Software die länger als bis zum Projektende betrieben wird. Danach versteht niemand mehr was letztendlich im System vor sich geht bzw. an welchen Stellen das Verhalten von Klassen "mal kurz" umgebogen wird. Diese Erweiterungen sind der Les- und Wartbarkeit des Systems aus meiner Erfahrung nicht gerade zuträglich.

Einziger Benefit ist, dass dieser syntaktische Zucker die Bequemlichkeit der Entwickler unterstützt. Dies hat zugegebener Maßen auch mich anfangs fasziniert. Anstatt eine Klasse abzuleiten und diese mit Funktionalität anzureichern, modifiziert der Entwickler solange an der Basis herum bis diese das tut was er möchte.

Ich stelle daher nun folgende Frage in den Raum:
Warum kann man nicht einfach die OO gegebenen Bordmittelnutzen anstatt jedes (nennen wir es einmal positiv) Feature von C# blind zu übernehmen?
#zitieren
Gravatar Christian 28.05.2010
um 10:44 Uhr
Es geht wohl doch weiter: http://www.tutego.de/blog/javainsel/2010/05/bald-ist-java-weihnachten-lambdaclosures-schon-fast-in-java-7/ #zitieren

Folgende Links könnten Sie auch interessieren

  • Groovy in Action  [26.02.2007]
    [http://it-republik.de/jaxenter/news/Groovy-in-Action-000606.html]
  • JavaScript  [06.11.2007]
    [http://it-republik.de/jaxenter/news/JavaScript-000671.html]
  • Generative Programming  [04.09.2002]
    [http://it-republik.de/jaxenter/news/Generative-Programming-000126.html]
  • Linux verstehen und administrieren  [15.08.2007]
    [http://it-republik.de/jaxenter/news/Linux-verstehen-und-administrieren-000650.html]
  • Portabler Code  [18.04.2007]
    [http://it-republik.de/jaxenter/news/Portabler-Code-000614.html]
zurück zum Seitenanfang