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.
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%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.
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.
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%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%