Objekte übergeben / referenzieren

Flex IV

Mitglied
Hallo,
komischerweise finde ich zu folgendem auch nach längerem googeln nichts wirklich hifreiches:

Ich habe also eine klasse A (extends JFrame), die implementiert mein Haupfenster.
in der erzeuge ich ein Objekt der klasse Diagnose (extends JDialog):
Java:
public Diagnose DiagForm = null;
...
	//	Diagnosefenster starten:
		JFrame diagJF = new JFrame();
		DiagForm = new Diagnose (diagJF);
		DiagForm.Add ("Diagnose gestartet. ");
Wunderbar - ich kann also im Diagnosefenster was ausgeben:
Java:
public class Diagnose extends JDialog {
...
	public Diagnose(Frame owner) {
		super(owner);
		initialize();
		this.setVisible(true);
	}

Mein Problem: Um dieses (in A) erzeugte Objekt nun generell im Programm verfügbar zu machen habe ich noch folgende
Methode in Diagnose erstellt:
Java:
	public Diagnose getDiagnose () {
		return (this);
	}

Nun erzeuge ich also (in A) ein Objekt einer dritten Klasse, nennen wir sie mal B1 :
b1 = new B1;

In dieser möchte ich auch auch die Diagnose nutzen. Also habe ich in B1 eine entsprechende Objekt-Variable deklariert,
und versuche nun in B1 mir das Diagnose Objekt verfügnar zu machen:
Java:
Diagnose df = null;
    ...
	private void initialize() {
		this.setSize(300, 200);
		...
		df = getDiagnose();
	}
Jetzt bekomme ich aber einen Fehler: getDiagnose() is undefined for the type B1.

Was mache ich falsch bzw. wie mach ichs richtig ?

Vielen Dank schonmal!
 
Hallo Bobblz,
Was an "in dieser (Klasse B1) möchte ich auch auch die Diagnose nutzen" ist denn nicht verständlich?
Der komplette Code hat ein paar hundert Zeilen
Gruss Flex
 
Der Fehler ist ja auch berechtigt, du versuchst auf die Methode getDiagnose() zuzugreifen ohne dabei das Objekt zu referenzieren. Im Prinzip ist das, was du da versuchst sinnlos. Du musst, um die Methode aufrufen zu können, auf das entsprechende Objekt zugreifen können und bekommst als Rückgabe der Methode das Objekt selbst, also total sinnfrei ...

Für mich klingt das nach einem Fall für ein Singleton, da stellt sich jetzt aber die Frage, ob du mehrere Objekte dieser Diagnose-Klasse brauchst. Wenn nicht, dann einfach nach Singleton-Pattern verfahren.

Beispiel:
Java:
public class Diagnose extends JDialog {
	private static Diagnose instance;
	
	private Diagnose() {
		// Was eben im Konstruktor so passieren soll
	}
	
	public synchronized static Diagnose getInstance() {
		if(instance == null) {
			instance = new Diagnose();
		}

		return instance;
	}
}
Dann kannst du dir die Instanz so holen:
Java:
Diagnose d = Diagnose.getInstance();
Wie gesagt, dabei wird es nur eine einzige Instanz geben. Andernfalls wirst du wohl oder übel die Objekte anderen Objekten zugänglich machen müssen, auf welche Weise ist deine Sache. Falls das nicht so ganz das ist, was du lesen wolltest, dann solltest du das Problem etwas konkreter werden, denn mit deinen Schnippseln kann man nicht erkennen, wo welches Objekt liegt und somit ist auch dessen Sichtbarkeit für uns total unklar ...
 
Zuletzt bearbeitet:
Java:
Diagnose df = null;
    ...
    private void initialize() {
        this.setSize(300, 200);
        ...
        df = DiagForm.getDiagnose();
    }

Versuch es mal so. Du musst ja schließlich sagen, wo er die Funktion getDiagnose() aurufen soll.
Du musst dafür der Klasse B1 eine Referenz auf die Klasse A übergebe.

Oder du erstellst einen Konstruktor der Klasse B1, bei dem eine Referenz auf eine Instanz der Klasse Diagnose übergeben wird:
Java:
public B1(Diagnose d) {
df =d;
}
 
Zuletzt bearbeitet von einem Moderator:
Singleton wäre gefährlich, damit würden parallel arbeitende Instanzen von A sich die Instanz von Diagnose teilen. Verschiedene As müssen denke ich ihre eigene Instanz von Diagnose haben.

Ich würde auch die Konstruktorvariante von Bobblz empfehlen.

edit: typo
 
Wenn du mehrere Diagnose-Objekte brauchst, solltest du am besten im Konstruktor dafür sorgen, dass ein neu erzeugtes Objekt sich zusammen mit einem eindeutigen Key in einer privaten Diagnose-Collection ( Klassen-Variable ! ) einträgt, z.B. einem HashTree.
Mit Hilfe einer statischen Funktion getDiagnoseObjekt(key) (oder so ähnlich, musst du natürlich selber schreiben) kannst du dann ein bestimmtes Diagnose-Objekt über seinen Key abrufen.
Du musst dann aber auch die finalize-Methode überschreiben, damit sich das Objekt wieder aus der Collection löscht, sobald es vom Garbage Collector eingesammelt wird.
 
Zuletzt bearbeitet:
@ Akeshihiro:
Vielen Dank - das mit getInstance ist genau das was ich brauche. Deswegen hab ich die Klasse Diagnose ja auch beim Namen genannt:
Ähnlich wie stdout braucht man ja nur ein Diagnosefenster im ganzen programm... oder?
Den Begriff Singleton werde ich jetzt mal googlen - den kannte ich noch nicht, scheint aber wohl das zu sein, um was es mir hier ging!

@Bobblz:
df = DiagForm.getDiagnose();
geht genausowenig - es spielt sich ja wie im 1. postbeschrieben in B1 ab, und da ist DiagForm ja unbekannt weil nicht deklariert.

Dank+Grüsse
 
Danke, schon klar - Das ist aber im diesem Fall nicht wirklich schön, an alle Klassen im Programm das Dignose-Objekt zu übergeben nur weil eventuell mal eine Testausgabe gemacht wird...
 
Zurück