Daten in einer Klasse "speichern"

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Also ich habe eine Klasse Data in der ich alle Variablen usw. haben und diese über methoden verändern kann usw.

public String get....

public void set....

usw.

Variablen ansich sind private

Jetzt habe ich aber das Problem, dass 2 Klassen auf die Klasse Data zugreifen müssen.

Aber wenn ich in beiden Klassen Data d1 = new ´Data() mache, dann habe ich ja 2 verschiedene Objecte von data und nicht das was ich brauche, denn beide Klassen sollen das Gleiche object verwenden..

Oder bleibt hier nichts anderes übrig als das ganze static zu machen?

Will nicht umbedingt mit static arbeiten, aber wenn das die einzige möglichkeit ist?

Habt ihr ne meinung dazu wie ich das beheben kann, dass ich aus 2 Klassen auf eine zugreifen kann.
 
Code:
Data d = new Data();

MyClass c1 = new MyClass(d);
MyClass c2 = new MyClass(d);

oder

Code:
c1.setData(d);
c2.setData(d);
 
die andere Möglichkeit, wie sie etwa bei 99% aller Java-Tätigkeiten eingesetzt wird:
Objekt als Parameter übergeben


wenn du
data.setName(name);
ausführst, dann übergibst du ja auch den Namen und speicherst ihn nicht irgendwo statisch 😉

wenn die beiden Klassen/ Objekte, die das gemeinsame Data-Objekt brauchen,
nicht direkt interagieren, dann wird die Übergabe schwierig, das stimmt,
es ist durchaus denkbar, dann für grundlegende Programm-Daten statische Variablen zu verwenden,
aber machbar ist auch eine Übergabe
 
Übergib einfach das entsprechende Objekt von Daten den Objekten die damit arbeiten sollen im Konstruktor.


In etw so:

Code:
Daten workData = new Daten();


...

DataWorker worker1 = new DataWorker(workData );
DataWorker worker2 = new DataWorker(workData );
 
hmm... also ich habe die Klasse GUI und die Klasse Calc.

Beide müssen auf die Klasse Data zugreifen, d.h. beide Klassen rufen eben Methoden der Klasse Data auf.

bisher kenne ich eben es so dass ich in der Klasse GUI und Calc jeweils Data d = new Data() gemacht habe.. nun hatte ich das problem, dass ich ja 2 Objecte der Data hatte...

Will aber nur 1 Object haben.. sry habe die erklärungen oben nicht wirklich verstanden, könnte das jmd. nochmal erklären pls...

Also meine Klassen sind

GUI
Calc
Data

Gui und Calc benutzen beide methoden von Data...

wie kann ich das nun realisieren?
 
Schau dir mal in den FAQ das Singleton-Pattern an. Damit kannst du das lösen.

Deine Klasse Data müsste dann in etwa so aussehen:

Code:
public class Data()
{
    private Data data = null;

    private Data()
    {
    }
    
    public static Data getInstance()
    {
        if(data == null)
        {
            data = new Data();
        }
        
        return data;    
    
    }

    public void macheIrgendwas()
    {
    }

}

Zugriff auf die Methoden macheIrgendwas() erhälst du dann so:

Code:
Data.getInstance().macheIrgendwas();

So greifst du immer auf denselben Speicher zu.
 
Ok vielen Dank,

eine andere möglickeit gibts da nicht oder, also ohne statische sachen.

Na ja es geht zumindest, wäre das auch "guter" code.

Also kein pfusch?

Viiieeeelen dank schonmal
 
Das Singleton-Pattern ist sehr weit verbreitet, auch im JDK. Ist kein Pfusch.
Static ist nicht immer schlecht. Was unten im Code fehlt (sehe ich gerade):
Das Klassenobjekt data muss auch als static definiert werden.

Was natürlich auch ginge, um das static zu vermeiden, wäre die Daten in der Klasse Data immer komplett zu serialisieren/deserialisieren, also schön in Dateien wegschreiben und wieder einlesen.
 
Timmah hat gesagt.:
Was unten im Code fehlt (sehe ich gerade):
Das Klassenobjekt data muss auch als static definiert werden.

Ja danke habe ich auch gemerkt ^^. Danke.

Jetzt habe ich ja ein Object das alle daten enthält, wäre dies nun möglich in eine datei zu schreiben, also quasi speichern?

Will in mein Programm ein save/load funktion einbauen.

Geht soetwas?
 
Schau dir dazu die Klassen ObjectInputStream und ObjectOutputStream an.

Klassenobjekte, die nicht gespeichert werden sollen, kannst du als transient definieren.
 
Anonymous hat gesagt.:
hmm... also ich habe die Klasse GUI und die Klasse Calc.

Beide müssen auf die Klasse Data zugreifen, d.h. beide Klassen rufen eben Methoden der Klasse Data auf.

Kennt GUI Calc, oder kennt Calc GUI? Oder gibt es eine weitere (Controller-)Klasse, die die beiden anderen Klassen kennt? Wenn das so ist, dann reicht es doch, einmal ein Data-Objet zu erzeugen und das dem anderen Verwender z.B. im Konstruktor zu übergeben.

Wirklich notwendig dürfte der Singleton-Ansatz hier nicht sein. Und eine Serialsierung des Data-Objekts wäre wohl eine Lösung von hinten durch die Brust ins linke Auge...
 
Anonymous hat gesagt.:
....
Na ja es geht zumindest, wäre das auch "guter" code.
....


Wie bereits erwähnt ist der Code schon OK, wenn man wirklich nur eine Instanz haben will.

Ein Anmerkung hätte ich jedoch noch:

Sowie ich das sehe wird das Daten Objekt in jedem Fall benötigt, von daher würde ich hier von einer "lazy-initialisation" absehen. Soll heißen:

Code:
    private static Data data = new Data();

    private Data() {
    }
   
    public static Data getInstance() {       
        return data;   
   
    }
 
Timmah hat gesagt.:
Das Singleton-Pattern ist sehr weit verbreitet, auch im JDK. Ist kein Pfusch.
Das Singleton-Pattern ist nun wirklich das letzte, was ich hier empfehlen würde. Wenn Objekte Zugriff auf andere, bereits existierende Objekte benötigen, dann übergibt man sie einfach im Konstruktor. Das Singleton-Pattern ist in 99% der Fälle unangebracht.
 
Anonymous hat gesagt.:
Das Singleton-Pattern ist nun wirklich das letzte, was ich hier empfehlen würde. Wenn Objekte Zugriff auf andere, bereits existierende Objekte benötigen, dann übergibt man sie einfach im Konstruktor. Das Singleton-Pattern ist in 99% der Fälle unangebracht.

Zustimmung. Das Pattern sollte man nur verwenden wenn man es wirklich braucht. Wenn in dem hier gebrachten Beispiel ein zweites Calc Objekt mit einer anderen Datenbasis (Data) benoetigt wird, steht man mit Singleton im Regen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben