Callback-Prinzip

Status
Nicht offen für weitere Antworten.
L

Lila

Gast
Hallo!

Weiss jemand etwas mit dem Callback-Prinzip anzufangen?
Ich bin darauf im Zusammenhang mit binären Bäumen gestossen, jedoch ist mir die Implementierung nicht klar, was damit zusammenhängt, das ich eigentlich auch den Sinn und Zweck dieser Technik nicht verstehe ???:L
So wie ich es bisher verstanden habe, soll mir die Callback-Technik helfen, allgemeinen Quellcode unabhängig von den übergebenen Objekten zu schreiben (wiederverwertbarkeit), anderseits habe ich diese Technik im Zusammenhang mit Ereignissbehandlung wiedergefunden :(

Ich wollte das ganze auf einen postorder-Durchlauf eines binären Baumes anwenden. Visitor ist ein Interface, was für die Anwendung der Callback-Technik dienen soll. Nur was übergebe ich an diesen ?

Code:
public static void postOrder(Node node, Visitor visitor){
				 if(node!=null){ 
					 postOrder(node, visitor); //linker Nachfolgerknoten wird übergeben
					 postOrder(node, visitor);//rechter Nachfolgerknoten wird übergeben
					 visitor.visit(node);
					 
				 }
}

Bin ziemlich verwirrt;(
 

Wildcard

Top Contributor
hmm, ich glaube du verwechselst da was.
Callback ist eine Technik die in Java nicht üblich ist (wenn auch über Reflections möglich), dabei wird eine Funktion als Paramter übergeben die anschließend aufgerufen wird.
Der OOP Ersatz für Callbacks ist das Command-Pattern.
Der Visitor hingegen wird verwendet wenn einer bestimmten Menge an Klassen eine Funktionalität hinzugefügt wird, die nicht direkt in den Klassen enthalten sein soll.
 

byte

Top Contributor
Ein gutes Anwendungsbeispiel für Callback Methoden ist das SAX-Prinzip - also das eventbasierte Parsen von XML-Dateien. Da XML in Form einer Baumstruktur aufgebaut ist, passt es also auch ferner zu Deinem Anwendungsbeispiel. Einfach gesprochen funktioniert das ganze so, dass ein SAX-Parser ein das XML-Dokument einliest und je nachdem, welches Ereignis eintrifft, wird eine gewisse Callback Methode aufgerufen. Der Parser hat dabei keinen blassen Schimmer, was diese Callback Methoden tun. Man kann nun also einfach diese Callback Methoden implementieren und auf beliebige Weise mit den XML-Daten umgehen. Die Callback Methoden sind u.a. in org.xml.sax.helpers.DefaultHandler. Da gibts z.b. die Callback Methoden startDocument() oder startElement().

Man sieht daran also sehr gut, wie man mit Hilfe des Callback-Prinzips den Code flexibel und wiederverwendbar machen kann.
 

Wildcard

Top Contributor
byto hat gesagt.:
Einfach gesprochen funktioniert das ganze so, dass ein SAX-Parser ein das XML-Dokument einliest und je nachdem, welches Ereignis eintrifft, wird eine gewisse Callback Methode aufgerufen. Der Parser hat dabei keinen blassen Schimmer, was diese Callback Methoden tun.
Ist allerdings kein klassisches Callback, da Methoden nicht direkt übergeben werden, sondern Objekte die ein bestimmtes Interface implementieren....
 

byte

Top Contributor
Stimmt hast Recht, klassisches Callback ist es nicht. In irgendeinem Buch wurde in dem Zusammenhang mal von Callback Methoden gesprochen, wenn ich mich jetzt noch an die Quelle erinnern könnte. *grübel* Naja auch egal, es ist halt eine Art Pseudo-Callback. ;)
 

Jörg

Bekanntes Mitglied
naja die Listener-Methoden sind schon auch Callbacks. Wenn
auch kein *klassisches*, aber wenn man davon ausgeht, dass
man in Java keine Methoden uebergeben kann, ist das ok denke
ich.

Um auf die Frage zurueck zu kommen, uebergibts du *in* deinem
Algorithmus ja den Visitor. Desen visit() Methode ist jetzt der
Callback, da der (abstrakte) Algorithmus auf diese Weise auf
*deine* Implementierung *zurueckgreift*.

Genauso machst du es beispielsweise mit dem Interface Comparable.
*Du* implementierst die Methode compareto,
welche von irgendwelchen Sortieralgorithmen aufgerufen wird.
Genau dieser Aufruf wird als CallBack bezeichnet und die Methode
als Callback-Methode. :D
 

Wildcard

Top Contributor
Jörg hat gesagt.:
naja die Listener-Methoden sind schon auch Callbacks. Wenn
auch kein *klassisches*, aber wenn man davon ausgeht, dass
man in Java keine Methoden uebergeben kann, ist das ok denke
ich.
Natürlich kann man in Java Methoden übergeben (Reflection). Das währe dann echtes Callback, da hier keinerlei Anforderungen gestellt werden (kein Interface implementieren oder ähnliches)
 

Jörg

Bekanntes Mitglied
Wildcard hat gesagt.:
Natürlich kann man in Java Methoden übergeben (Reflection)

Hm ich waere da vorsichtig. Reflections bilden die Methoden
und Funktionen ab und macht daraus Objekte die du verarbeiten
kannst - ok. Aber das sind *keine* Sprachkonstrukte sondern
Bibliotheksfunktionen; also wenn man von der *Sprache* Java
ausgeht kann man keine Funktionen uebergeben, wie das zB in C
moeglich ist, oder kannst du das machen:
Code:
public void aCallBack() { .. } 
public void work() { 
   someOtherWork(aCallBack);
}
wenn ja, wuerd es mich freuen davon zu lesen (ohne Reflections).
 

Wildcard

Top Contributor
Jörg hat gesagt.:
Wildcard hat gesagt.:
Natürlich kann man in Java Methoden übergeben (Reflection)
Aber das sind *keine* Sprachkonstrukte sondern
Bibliotheksfunktionen; also wenn man von der *Sprache* Java ausgeht kann man keine Funktionen uebergeben, wie das zB in C moeglich ist
Richtig. Deshalb ist in Java echtes Callback eben nur über Reflections möglich und wird in der Praxis durch OOP Patterns wie zum Beispiel Commands ersetzt.
Auf Reflection sollte man wo immer möglich verzichten.
Die andere Geschichte mit den Interfaces (egal ob man das jetzt CallBack-Methode oder wie auch immer nennt) ist nicht das gleiche, auch wenn es durch den Namen impliziert wird.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben