Delegation in Java. Wie gehts?

Thallius

Top Contributor
Hi,

ich komme ja eigentlich von Objective-C und OSX. Dort ist Delegation ein sehr häufig benutzes Pattern und irgendwie würde ich das gerne in Java auch so umsetzen aber durch das strikte Typecast von Java bekomme ich das nicht hin. Aber irgendwie muss es ja gehen.

Folgende Situation.

Ich abe zwei ViewController A und B. Beide Klassen müssen nun etwas berechnen und machen darum einen Langzeit-Requester auf. Da ich diesen ja öfter benutze packe ich den in eine eigene Klasse. Dieser öffnet sich nun und besitzt einen Abbruch-Button. Wird dieser Button gedürckt, so muss der aufrufende Controler darüber benachrichtigt werden, damit er das Berechnen abbrechen und den Langzeit-Requester schließen kann.

In Objective-C bekommt dazu der Langzeit-Requester ein Delegate Protokoll wo definiert ist, welche Methode eine Klasse implementieren muss um sein delegate zu werden. In dem Fall z.B.

void requesterDidCancel();

und der Requeter erhält eine property delegate vom typ id (undefinierter pointer auf irgendein object).
Wird nun der Abbruch-Button geklcikt, dann ruft der Langzeitrequester einfach

this.delegate.requesterDidCancel();

auf und fertig.

Damit ist dem Langzeit-Requester egal von was für einem Object er aufgerufen wird, wichtig ist nur, dass dieses die Methode requesterDidCancel() implementiert hat.

Wie löst man so etwas in Java?

Gruß

Claus
 
Mit einem Listener.

Dein Konkretes Problem löse ich aber immer so: Für jede Aufgabe, welche längere Zeit in Anspruch nimmt erstelle ich eine Klasse welche von etwas wie "Job", "Task" oder "Process" erbt. Diese hat dann die Methoden wie start(), stop(), pause(), getCurrentProgress(), getDescription() u.s.w.
Dazu habe ich ein Frame welches genau dafür gedacht ist, einen solchen Job zu "visualisieren" (mit Progressbar, ETA anzeige etc). Drückt der User dort "Abbrechen", ruft das Frame stop() auf dem Job/Task/Process auf und gut ist.
Dein Controller müsste also seine Berechnung in einen Job/Task/Process auslagern, der "Visualisierung" übergeben und start() ausführen.
 
Zuletzt bearbeitet:

Zurück
Oben