Hallo,
ich habe eine Klasse, die Referenzen auf Objekte einer inneren Klasse rausgibt; die innere Klasse implementiert dazu ein öffentliches Interface. Diese Referenzen sollen später wieder an die äußere Klasse zurückgegeben werden, wobei ich aber sicherstellen möchte, dass die referenzierten Objekte wirklich zu der entsprechenden Instanz der äußeren Klasse gehören (und nicht zu einem _anderen_ Objekt der äußeren Klasse).
Das scheint nur so zu funktionieren:
public interface Knoten{ }
public class Graph {
public Knoten neuerKnoten() { return new MeinKnoten(); }
public boolean istMeinKnoten(Knoten i) {
return (i instanceof MeinKnoten)
&& ((MeinKnoten)i).graph() == this;
}
class MeinKnoten implements Knoten {
Graph graph() { return Graph.this; }
}
}
Gibt es einen einfacheren Weg dazu, bei dem die graph() Methode in der inneren Klasse nicht notwendig ist?
Viele Grüße, Daniel
Hallo Daniel,
leider verstehe ich nicht ganz den Sinn deiner Implementierung, aber du wirst sicherlich einen Grund dafür wissen, oder?
Meine Fragen:
a) Warum erstellst du nicht eine eigene Klasse anstatt der inneren Klasse?
oder
b) Warum gibst du nicht die Referenz des Graph-Objektes an deine innere Klasse weiter?
Ich habe in meiner gesamten Java-Programmierung noch nie ein solches Konstrukt benutzt, daher hinterfrage ich erstmal den Sinn.
Also nicht böse sein!
Ciao, Bill
Hallo Bill,
a) Warum erstellst du nicht eine eigene Klasse anstatt der
inneren Klasse?
Ich moechte mich darauf verlassen koennen, dass die Objekte der inneren Klassen konsistent zueinander sind. Mein Programm ist in Wirklichkeit natuerlich komplizierter, beispielsweise habe ich innere Klassen zu sowohl den Knoten als auch den Kanten des Graphen, mit Referenzen untereinander, wie Anfangs- und Endknoten einer Kante und die Liste der inzidenten Kanten eines Knotens.
Wenn alles einzelne Klassen waeren, musste ich public Methoden haben, um z.B. diese Referenzen zu setzen. Dann koennten diese Methoden aber auch von aussen aufgerufen und die ganze Struktur in einen inkonsistenten Zustand gebracht werden.
b) Warum gibst du nicht die Referenz des Graph-Objektes an
deine innere Klasse weiter?
Koennte ich machen, aber in der inneren Klasse gibt es mit Graph.this ja schon genau so eine Referenz. Ich wuerde diese Referenz eben gerne von der aeusseren Klasse aus lesen koennen, ohne den Umweg ueber
die Methode Meinknoten.graph().
Viele Gruesse, Daniel