Schließung und Rückrufe

8

Gibt es in Java eine andere Möglichkeit Callbacks außerhalb der inneren Klassen zu implementieren? Was ist der Unterschied zwischen Rückrufen und Schließungen?

    
Neeraj 18.03.2010, 09:55
quelle

9 Antworten

10

Schließung ist, wie Sie es bauen, Callback ist, wie Sie es verwenden.

Ein Callback kann als Closure implementiert werden (in Sprachen, die sie haben) oder eine Implementierung einer Schnittstelle (in Java als anonyme innere Klasse oder reguläre Klasse).

Callback bedeutet, dass Sie einen Code an eine Funktion übergeben, damit die Funktion diesen Code später aufrufen kann. Es ist eine spezielle Art von Parameter.

Das Stück Code kann ein Funktionszeiger oder eine Schließung oder ein Objekt mit bekannten Methoden sein, je nachdem, was die Sprache anbietet.

    
Thilo 18.03.2010, 10:11
quelle
5

Sowohl Closures als auch anonyme innere Klassen (und andere) können als Callbacks verwendet werden. Ein Rückruf ist nur ein Code, der als Argument an anderen Code übergeben wird.

Ein großer Unterschied zwischen Closures und den anonymen inneren Klassen von Java besteht darin, dass (in Imperativsprachen) eine Closure die Variablen des umgebenden Bereichs verändern kann. Wikipedia gibt das folgende Beispiel:

%Vor%     
Esko Luontola 18.03.2010 11:49
quelle
1

Ein Callback ist nur ein beliebiger ausführbarer Code, der als Parameter an anderen Code übergeben wird. Bei häufigem Gebrauch ist dieser ausführbare Code ein Abschluss, aber nicht unbedingt.

Das Wort closure wird missbraucht und viele Leute benutzen es einfach als Synonym für "anonyme Funktion", aber zumindest Laut Wikipedia ist das ein Missbrauch des Begriffs. Der Wikipedia-Artikel erklärt das besser, als ich schnell tun kann.

    
Don Roby 18.03.2010 11:40
quelle
1

Wenn Sie Schließungen in Java benötigen, können Sie lambdaj ausprobieren. Hier können Sie sehen, wie es möglich ist, Schließungen über ein sehr einfaches DSL zu definieren.

    
Mario Fusco 18.03.2010 13:25
quelle
0

Das glaube ich nicht.

Wenn ja, ist es wahrscheinlich in irgendeiner Weise unterlegen, sonst würden anonyme innere Klassen nicht weit verbreitet sein.

    
Matthew H 18.03.2010 10:00
quelle
0

Es gibt keinen Unterschied.

Closures können als ein Code-Block definiert werden, der den übergeordneten Kontext enthält und leicht ausgeführt werden kann.

Tatsächlich ist der einzige Unterschied, den ich zwischen denen kenne, die Leichtigkeit des Schreibens. Ein typischer Groovy / Ruby-Verschluss ist in der Tat kleiner zu schreiben als eine anonyme Javaklasse.

Betrachtet man jedoch Java-Framworks wie Guave und die freie Verwendung von anonymen Klassen / Interfaces, insbesondere für typische Closures verwenden Fälle wie filter (Vergleich mit groovy's Implementierung ), ich kann sagen, dass es absolut keinen Designunterschied gibt.

    
Riduidel 18.03.2010 10:02
quelle
0

Leider ist der einzige vernünftige Weg innere / anonyme Klassen.

Sie können es auch mit Reflektion machen, aber das ist in der Regel langsamer und schwieriger in der Wartung (keine Syntax-Hervorhebung, schwer zu finden Referenzen in der IDE usw.). Ein Beispiel:

%Vor%     
Konrad Garus 18.03.2010 10:02
quelle
0

Für jetzt sind anonyme Klassen der beste Weg, Callbacks in Java zu handhaben. Dies wird sich jedoch wahrscheinlich ändern, wenn Java 7 implementiert wird. Ссылка

    
Mex 18.03.2010 10:52
quelle
0

Hier sind es zwei Implementierungen, die Closures und Callbacks verwenden.

Und hier ist ein besseres Beispiel (kann hier gefunden werden Ссылка ) um zu verstehen, was die Schließung ist. Der Schlüssel ist das

  

Eine Schließung kommt mit einer referenzierenden Umgebung und nicht nur mit einem Funktionscode.

Der beste Weg, um eine Schließung in Java 7 und darunter zu implementieren, ist die Verwendung einer Schnittstelle. In diesem Beispiel ist ein Callback als Closure implementiert.

Sie erklären zuerst Ihre Schnittstelle, die Ihre Schließung halten wird.

%Vor%

Und wir können eine Klasse hinzufügen, die für ein Array von Closures verantwortlich ist, zwei öffentliche Methoden zum Hinzufügen und Entfernen von Closures und eine öffentliche Funktion, die die Funktionen in den Closures aufruft, wenn ein Ereignis eintritt.

%Vor%

Und hier ist der magische Teil. Siehe die referenzierende Umgebung in Aktion.

%Vor%

Oben, wenn wir cb1 deklarieren, fügen wir eine referenzierende Umgebung hinzu, die aus der Variablen x besteht. Wenn wir die Funktion innerhalb dieses Abschlusses aufrufen, inkrementieren wir diese Variable um eins. Wenn es eine normale Funktion wäre, wäre x beim Aufrufen der Funktion als 1 deklariert worden. ABER ES IST KEINE NORMALE FUNKTION. Es ist eine Schließung. Also wird x nicht jedes Mal deklariert, wenn wir die Funktion im Closure aufrufen. Wie Sie aus der Ausgabe bei jedem Aufruf sehen können, wird x inkrementiert.

%Vor%     
cgon 05.04.2013 18:35
quelle

Tags und Links