Hallo, heute möchte ich etwas mit Ihnen teilen. Dies wird beispielsweise häufig in JavaScript verwendet. Ich werde über Rückrufe sprechen. Wissen Sie, wann und wie Sie dies verwenden? Verstehen Sie die Verwendung in der Java-Umgebung wirklich? Als ich mir diese Fragen stellte, begann ich mit der Recherche. Die Idee dahinter ist Inversion of Control (PS: Wikipedias Erklärung ist Inversion of Control, abgekürzt als IoC), ein Designprinzip in der objektorientierten Programmierung, das verwendet werden kann, um die Kopplung zwischen Computercodes zu reduzieren.) Dieses Beispiel beschreibt, wie das Framework funktioniert, auch nach dem bekannten „Hollywood-Prinzip – Ruf mich nicht an, wir rufen dich an“.
Verwenden Sie das einfache Rückrufmuster in Java, um es zu verstehen. Die spezifischen Beispiele lauten wie folgt:
interface CallBack { void methodToCallBack();}class CallBackImpl implementiert CallBack { public void methodToCallBack() { System.out.println("Ich wurde zurückgerufen"); }}class Caller { public void register(CallBack callback) { callback .methodToCallBack(); } public static void main(String[] args) { CallBack callBack = new CallBackImpl(); caller.register(callBack);
Vielleicht möchten Sie mich fragen, wann Sie dies verwenden sollten oder was der Unterschied zwischen dem Direktanruf- und dem Rückrufmechanismus ist.
Die Antwort lautet: Nun, dieses Beispiel zeigt Ihnen nur, wie Sie eine solche Rückruffunktion in der Java-Umgebung erstellen. Natürlich hat es keinen Sinn, es so zu nutzen. Lassen Sie uns es nun genauer untersuchen.
Die darin enthaltene Idee ist die Umkehrung der Kontrolle. Nehmen wir einen Timer als Beispiel aus dem wirklichen Leben. Angenommen, Sie wissen, dass es einen speziellen Timer gibt, der stündliche Rückrufe unterstützt. Genauer gesagt bedeutet dies, dass der Timer jede Stunde die von Ihnen registrierte Aufrufmethode aufruft.
Konkrete Beispiele:
Wir möchten die Website stündlich aktualisieren. Hier ist das UML-Modell für das Beispiel:
Rückrufschnittstelle:
Definieren wir zunächst die Callback-Schnittstelle:
import java.util.ArrayList;import java.util.List;// Zum Beispiel: Nehmen wir an, dass diese Schnittstelle von Ihrem Betriebssystem zur Implementierung angeboten wirdinterface TimeUpdaterCallBack { void updateTime(long time);}// Dies ist Ihre Implementierung./ / zum Beispiel: Sie möchten die Uhrzeit Ihrer Website jede Stunde aktualisieren. class WebSiteTimeUpdaterCallBack implementiert TimeUpdaterCallBack { @Override public void updateTime(long time) { // die aktualisierte Uhrzeit ausgeben irgendwo im Beispiel Ihrer Website System.out.println(time);
In unserem Beispiel unterstützt der Systemtimer Callback-Methoden:
// Dies ist der von Ihrem Betriebssystem (OS) implementierte SystemTimer. // Sie wissen nicht, wie dieser Timer implementiert wurde. // Dieses Beispiel zeigt Ihnen nur, wie es aussehen könnte Sie selbst, wenn Sie möchten.class SystemTimer { List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>(); public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) { callbacks.add(timerCallBack); } // ... Dieser SystemTimer hat hier möglicherweise mehr Logik, wir wissen es nicht ... // An einem bestimmten Punkt der Implementierung dieses SystemTimers (Sie wissen es nicht) / / Diese Methode wird aufgerufen und jeder registrierte timerCallBack // kann eine völlig unterschiedliche Implementierung der Methode updateTime() haben und kann von verschiedenen Clients auf unterschiedliche Weise verwendet werden oneHourHasBeenExprired() { for (TimeUpdaterCallBack timerCallBack : Rückrufe) { timerCallBack.updateTime(System.currentTimeMillis());
Abschließend sehen Sie hier den Website-Zeit-Updater in unserem einfachen Dummy-Beispiel:
// Dies ist unser Client. Er soll die Uhrzeit der Website stündlich aktualisieren webSiteCallBackUpdater = new WebSiteTimeUpdaterCallBack(); SystemTimer.registerCallBackForUpdatesEveryHour(webSiteCallBackUpdater);
Originaltext: http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understanding-callbacks-with-java.html