PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] SendMessage


Silpion
2005-08-16, 08:15:32
Hallöchen,

ich gehöre auch zu den Java-Umsteigern und komme recht gut damit zurecht, allerdings habe ich nun ein Problem, dass ich früher mit WinAPI-Befehlen wie SendMessage gelöst habe:
Ich habe zwei Klassen und je ein Objekt davon. Obj1 soll Methoden aus Obj2 aufrufen können und umgekehrt. Eine Richtung ist einfach, ich erstelle Obj2 als lokale Variable in Obj1, damit kann Obj1 auf Obj2 zugreifen und steuern. Umgekehrt war ich es (z.B. unter Delphi) gewohnt, dass Obj2 eine Nachricht an Obj1 schicken kann, damit dieses eine spezielle Methode ausführt.

Ein Ansatz wäre mit Threads, so dass Obj1 in einer Statusvariable in Obj2 nachsieht, ob es etwas machen soll; aber da nichts gleichzeitig geschehen soll und die Threads nie parallel aktiv wären, stehe ich dem Ansatz mit Threads eher abgeneigt gegenüber.

Wie kann ich dies vernünftig unter Java lösen?

Gast
2005-08-16, 08:36:24
Da können andere wahrscheinlich bessere Antworten geben, aber so spontan fällt mir eine superleichte, und eine ziemlich aufwendige Lösung ein:


1) Wie du ja schon gesagt hast, ist eine Richtung kein Problem, weil man das eine Objekt in das andere einbetten kann. Aber es spricht absolut nichts dagegen, die Referenz auch andersrum zu halten:



public class Klasse1{

private Klasse2 klasse2;

public Klasse1(){ klasse2 = new Klasse2(this); }

}

public class Klasse2{

public Klasse1 parent;

public Klasse1(Klasse1 klasse){ parent = klasse; }
}

Normalerweise sollte das kein Problem geben, aber möglicherweise sollte man eine von beiden Referenzen als "weak reference" deklarieren, damit der Garbage Collector sauber aufräumen kann.


Die komplizierte Möglichkeit kenne ich halt von Swing her. Man implementiert das passende Interface um Events abzusetzen, und registriert dann jeweils die andere Klasse als EventListener. Vorteil ist, dass man definierte Nachrichten an beliebig viele Objekte schicken kann, aber vom Konzept her ist das imho nichts anderes als das erste Beispiel, halt nur deutlich professioneller.


--- Monger

Silpion
2005-08-16, 12:16:33
Ich habe es nun inklusive WeakReference implementiert und es funktioniert exzellent. Für diesen Fall ist das wohl optimal, da nur zwei Objekte an der Kommunikation beteiligt sind.

Mit Events habe ich mich noch nicht beschäftigt, werde das aber nachholen, sobald ich mich um eine grafische Oberfläche kümmere.

Danke für die Hilfe. :)

Abnaxos
2005-08-16, 15:43:27
Normalerweise sollte das kein Problem geben, aber möglicherweise sollte man eine von beiden Referenzen als "weak reference" deklarieren, damit der Garbage Collector sauber aufräumen kann.

Über den Garbage Collector sollte man sich nicht zu viele Gedanken machen, schliesslich ist er dafür da, das Memory Management zu vereinfachen, nicht zu es zu verkomplizieren. Der GC hat natürlich keinerlei Probleme mit zirkulären Referenzen, wo kämen wir denn da hin? ;)