# Callback-Prinzip



## Lila (27. Aug 2006)

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 ?


```
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 (27. Aug 2006)

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 (27. Aug 2006)

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 (27. Aug 2006)

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 (27. Aug 2006)

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 (28. Aug 2006)

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.


----------



## Wildcard (28. Aug 2006)

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 (28. Aug 2006)

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:

```
public void aCallBack() { .. } 
public void work() { 
   someOtherWork(aCallBack);
}
```
wenn ja, wuerd es mich freuen davon zu lesen (ohne Reflections).


----------



## Wildcard (28. Aug 2006)

Jörg hat gesagt.:
			
		

> Wildcard hat gesagt.:
> 
> 
> 
> ...


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.


----------

