2010-07-02 6 views

Antwort

5

Sie sind nicht ganz so wie sie sind. Beide erstellen unbenannte Klassen, aber ihre Ähnlichkeit endet an diesem Punkt.

In C++ erstellen Sie einen Abschluss, der Ihre lokalen Variablen abfängt, optional durch Referenz. In Java erhalten Sie nur eine Momentaufnahme der Werte der aktuellen lokalen Variablen (und diese Variablen müssen "final" sein).

Der Zweck der anonymen inneren Klassen ist es, eine andere Klasse zu erweitern oder eine andere Schnittstelle ad-hoc zu implementieren. Aus diesem Grund können anonyme innere Klassen den Job von Lambda-Ausdrücken bis zu einem gewissen Grad simulieren, beispielsweise durch Implementieren der Schnittstelle Runnable. Lambda-Ausdrücke sind speziell dazu bestimmt, aufgerufen zu werden und möglicherweise die lokalen Variablen in ihrer Umgebung zu modifizieren.

+0

Außer Zugriff auf die Variablen im Bereich gibt es keinen Unterschied richtig? – yesraaj

+1

@yesraaj, ich kenne nicht die Einzelheiten innerer Klassen. Aber da der Zweck völlig anders ist, denke ich, dass wir sie nicht mit vernünftigen Methoden vergleichen können. In anonymen inneren Klassen wird das, was Sie im Body angeben, in den unbenannten Klassenhauptteil kopiert, der generiert wird. Sie können also mehrere Methoden, Klassenmitglieder usw. hinzufügen. Für C++ Lambdas geben Sie einfach den Inhalt des "operator()" an. –

+0

+1. Als eine Nebenbemerkung bietet C# noch einen anderen Ansatz für das Problem der Verschlüsse mit seinen eigenen Lambdas, die immer alle lokalen Variablen als Referenz erfassen. Sie können über Java/C# in [The Beauty of Closures] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx) in Jon Skeets Blog lesen. Der Artikel befasst sich nicht mit C++ Lambdas, wo Sie entweder nach Wert oder durch Referenz erfassen können, aber wie in den meisten anderen Fällen in C++, müssen Sie sich vor der Lebensdauer Ihrer erfassten Referenzen - das Lambda sollte nicht nach dem referenzierten verwendet werden Objekte wurden zerstört. –

2

C++ 0x Lambda-Ausdrücke sind unbenannte Methoden, Javas anonyme Klassen sind unbenannte Klassen. Sie teilen also keinen Namen, aber die Konzepte sind unterschiedlich.

Beginnend mit der offensichtlichen Tatsache, dass Lambda-Funktionen (kann) einen Wert zurückgeben und anonyme Klassen verwendet werden können, um Instanzen (Objekte) zu erstellen.

BTW - wikipedia erwähnt, dass nur Lambda Funktionen für C++ 0x vorgeschlagen werden.

+0

mit der Wortmethode ist ein bisschen Miss führen, Lambda-Ausdrücke sind keine anonyme Methoden, die sie anonyme Funktion sind . –

+0

@snk_kid: In C++ sind sie das Gleiche. Klassenfunktionen sind Member-Methoden. – Puppy

+0

@DeadMG Instanzmethoden sind nicht identisch mit einer Funktion, insbesondere in der traditionellen/ursprünglichen Bedeutung des Wortes aus Sprachen wie Smalltalk und Objective-C. Methoden sind OO-Terminologie, sie sind nicht Lambda-Kalkül oder funktionale Programmierung Terminologie, es gibt keine "Methoden" in funktionalen Sprachen wie Haskell oder SML. Also wie gesagt mit der Wortmethode ist irreführend und inkorrekt. –

4

Eine anonyme innere Klasse kann sich auf final Daten in der umschließenden Methode und auf alle Daten (einschließlich veränderbar) in der umschließenden Klasse beziehen. Daher können Methoden in anonymen Klassen die Werte von Variablen in der umschließenden Methode nicht ändern, sie können jedoch Werte von Elementen in der umschließenden Klasse ändern.

Ein C++ - Lambda kann alle Daten (einschließlich änderbar) in der umschließenden Funktion beziehen, und wenn es innerhalb einer Elementfunktion geschachtelt ist, kann es dasselbe für die Daten der umschließenden Klasse tun. Der genaue Grad der Abhängigkeit von dem (den) umschließenden Scope (s) wird vom Programmierer deklariert, er ist also explizit und nicht implizit.

Dies macht sie ziemlich ähnlich, aber die Java-Funktion behandelt lokale Variablen/Parameter in Methoden unterschiedlich, nach dem Prinzip, dass sie außerhalb der Methode nicht änderbar sein sollten, besonders in einer Sprache, die traditionell Threading so beiläufig verwendet.

Vergleichen Sie mit C# Lambda, die keine Einschränkungen haben und alle Abhängigkeiten implizit sind. Dies macht sie bei weitem die am wenigsten wortreiche dieser Funktionen (auch durch die beste Art Schlussfolgerung unterstützt). Aber auf der negativen Seite machen sie alle einfachen Regeln bezüglich Threading ungültig, d. H. Es ist nicht mehr unbedingt wahr, dass lokale Variablen "auf dem Thread-Stack" sind und daher vor dem Zugriff niemals gesperrt werden müssen.

+0

Greate Antwort.Verfügen Sie über bestimmte Ressourcen, mit denen ich Details (und vielleicht die Implementierung) von Java-Lambda-Funktionen besser kennenlernen könnte? –

Verwandte Themen