1. Einführung
In vielen Programmiersprachen ist das Konzept der Funktionsrückrufe vorhanden. Es gibt Funktionszeiger in C und C ++, sodass Funktionen als Parameter an andere Funktionen für einen späteren Anruf übergeben werden können. In JavaScript werden Funktionsaufrufe extrem gebracht. Der Umgang mit verschiedenen Ereignissen, insbesondere asynchronen Ereignissen, wird im Grunde genommen durch Funktionsaufrufe abgeschlossen.
In Java können auch Funktionsrufe implementiert werden. Obwohl es keinen Funktionszeiger gibt, kann Java eine Klassenmethode durch einen Reflexionsmechanismus erhalten, an andere Funktionen als Parameter des Typs Java.lang.reflect.method weitergeben und dann die Funktion über die Aufrufmethode des Method -Objekts aufrufen.
Dennoch sind die Anrufschritte auf diese Weise relativ umständlich, ineffizient in der Ausführung und schwer zu debuggen. In Java gibt es einen Mechanismus, der eleganter ist als Funktionsrückrufe, dh Schnittstellen.
2. Warum benötigen Funktionsrückrufe erforderlich?
Funktionsrückrufe sind tatsächlich eine Möglichkeit, die Implementierung bestimmter Funktionen zu verzögern.
Wenn wir im Voraus wissen, welche Vorgänge das Programm ausführen soll, besteht überhaupt keine Funktionsrückrufe und kann während der Programmierung direkt implementiert werden.
Beim Schreiben von Code, insbesondere beim Schreiben von Toolklassen, Funktionsbibliotheken oder Frameworks, werden jedoch relativ allgemeine und abstrakte Funktionen implementiert, während Funktionen in bestimmten Szenarien von Entwicklern mit diesen Klassen implementiert werden.
Funktionsrufe können diese Situation lösen, in der Sie die spezifische Implementierung im Voraus nicht kennen.
Beispiele für Sortierfunktionen
Wenn wir beispielsweise eine allgemeine Sortierfunktion implementieren möchten, wissen wir nicht im Voraus, welche Arten von Elementen andere Entwickler zum Sortieren verwenden, und wir wissen nicht, welche Standards zur Beurteilung der Verhältnis (Größe) dieser Elemente (Größe) dieser Elemente beurteilt werden.
Daher können andere Entwickler bei der Verwendung von Sortierfunktionen eine Vergleichsfunktion bereitstellen, damit wir vergleichen können, um die Größe der Elemente zu vergleichen, die sortiert werden sollen, ohne im Voraus zu wissen, welche Art von Elementen ist, oder die spezifische Implementierung des Vergleichs.
Hier ist die Komparienfunktion eine Rückruffunktion für die Sortierfunktion.
Der Pseudo-Code wird wie folgt dargestellt:
// Die allgemeine Sortierfunktion void sortieren (Object [] Array, Methode vergleichen) {// Verwenden Sie die Vergleichsfunktion, um die Größenbeziehung von Elementen im Array zu vergleichen // Sortieren Sie das Array} // Die spezifische Vergleichsfunktion wird vom Anrufer int implementiert.Beispiel für asynchrone Verarbeitungsfunktionen
Wenn wir beispielsweise eine asynchrone Verarbeitungsfunktion schreiben, wissen wir nicht im Voraus, was andere Entwickler bei der Verarbeitung tun sollten, da diese Vorgänge nur dann bekannt sein können, wenn die Funktion in einem bestimmten Szenario verwendet wird.
Daher können Entwickler bei der Verwendung dieser Funktion einen Rückruf von Callback -Funktionen bereitstellen. Auf diese Weise können wir, wenn wir asynchrone Verarbeitungsfunktionen schreiben, die Rückruffunktion aufrufen, um einige endgültige Arbeiten auszuführen, ohne zu wissen, was diese endgültigen Arbeiten im Voraus sind.
Der Pseudo-Code wird wie folgt dargestellt:
// Async -Verarbeitungsfunktion void Asynprocess (Methode Callback) {// Asynchronous Task Callback ();} // Die spezifische Rückruffunktion void Callback () wird vom Anrufer implementiert.3.. Verwenden Sie die Schnittstelle anstelle eines Funktionsrückrufs
Wir haben oben erwähnt, dass der Grund, warum Funktionsrückruf verwendet wird, darin besteht, dass wir die spezifische Implementierung bestimmter Funktionen im Voraus nicht kennen. Daher bleibt die spezifische Implementierung anderen Entwicklern überlassen, auszufüllen.
Denken Sie, dass dieser Satz die Java -Schnittstelle zu beschreiben scheint? Eine Schnittstelle ist eine abstrakte Definition einer Reihe von Methoden, und die spezifische Implementierung wird von der Klasse abgeschlossen, die die Schnittstelle implementiert.
Daher können mit den beiden Eigenschaften von objektorientiertem und grenzflächenorientiertem Funktionsrückruf ersetzt werden.
Wir geben die beiden obigen Beispiele an, um zu veranschaulichen, wie eine Schnittstelle einen Funktionsrückruf ersetzt.
Sortierfunktionen
Bei Verwendung einer Schnittstelle zur Implementierung der Sortierfunktion müssen Entwickler nicht mehr die Rückruffunktion bereitstellen, wenn die Sortierfunktion verwendet wird, sondern die Entwickler sicherstellen, dass die Elemente sortiert werden, um die vergleichbare Schnittstelle zu implementieren. Basierend auf der Prämisse, dass "die zu sortierten Elemente die vergleichbare Schnittstelle bereits implementiert haben", können wir die Sortierfunktion implementieren, ohne die Art der zu sortierenden Elemente zu kennen.
// Allgemeine Sortierfunktion void sortieren (Objekt [] Array) {// Verwenden Sie die vergleichbare Schnittstellenvergleichsmethode // Vergleiche die Größe der Elemente, um das Array zu sortieren. }//Interface defined by sorting function public interface Comparable { public int compareTo(Object other);}//Implement Comparable interface public class Element implements Comparable { @Override public int compareTo(Object other) { //Judge the current size relationship between Element and other// and return the relationship between the two}}Asynchrone Verarbeitungsfunktionen
Bei der Verwendung von Schnittstellen zur Implementierung asynchroner Verarbeitungsfunktionen benötigt der Entwickler den Rückruf von Rückruffunktionen nicht, sondern ein Objekt, das die angegebene Schnittstelle implementiert, die die java-objektorientierte Idee gut widerspiegelt. Im Vergleich zur Bereitstellung einer Funktion enthält ein Objekt mehr Informationen und ist flexibler zu verwenden. Diese asynchrone Verarbeitungsfunktion verwendet jedoch im Wesentlichen die Schnittstelle, um die Finishing -Arbeiten zu vervollständigen.
//Async processing function void asynProcess(ActionListener al) { //Execute asynchronous tasks al.actionPerformed();}//Interface defined by asynchronous processing function public interface ActionListener { void actionPerformed();}//Implement ActionListener interface public class ExtraTask implements ActionListener { @Override public void actionPerformed() { // zusätzliche Arbeit erforderlich, wenn die asynchrone Verarbeitungsfunktion abgeschlossen ist}} // Aufrufen der asynchronen Verarbeitungsfunktion public static void main (String [] args) {asynprocess (new extratask ());}4. Zusammenfassung
Die Rückrufmethode kann zusammengefasst werden als: Implementierung eines allgemeinen Funktionsfunktions. Wenn der Anrufer diese allgemeine Funktion in einem bestimmten Szenario aufruft, muss er einen geeigneten Rückruf von Callback -Funktionen bereitstellen. Allgemeine Funktion Func verwendet diese Rückruffunktion, um Aufgaben in bestimmten Szenarien zu erledigen.
Die Möglichkeit zur Implementierung der Schnittstelle ist: Implementieren eines allgemeinen Funktionsfunktions. Wenn Sie diese allgemeine Funktion in einem bestimmten Szenario aufrufen, muss das zu bedienende Objekt die entsprechende Schnittstelle für sich selbst implementieren. Die allgemeine Funktion verwendet diese Schnittstelle, um die Aufgaben im spezifischen Szenario zu erledigen.
Durch die Verwendung von Funktionsrückrufen oder Schnittstellen kann die Situation gelöst werden, in der Sie die spezifische Implementierung im Voraus nicht kennen. Die Funktionsrückrufmethode übergibt eine Funktion, während die Schnittstellenmethode ein Objekt übergibt, das die Schnittstelle implementiert.
In Java müssen Funktionsrückrufe mit Reflexionsmechanismen abgeschlossen werden, die anfällig für Fehler sind und ineffizient sind. Die Verwendung von Schnittstellen kann die Logik des Codes klarer, effizienter und leichter zu debuggen machen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.