Die Referenzierung von statischen Objekt erstellt, die in einer Klasse während des gesamten Anwendung
Ich habe eine java-Anwendung erstellt, die zwei statische Objekte, die in einer Basisklasse dieser Objekte muss die Verweise im gesamten Klassen im Programm.
public class Baseclass{
public static ClassA A = new ClassA();
public static ClassB B = new Classb();
...
...
...
}
Diese Objekte referenziert sind, in den anderen Klassen als privaten lokalen Variablen.
public class ClassA{
private ClassB b = Baseclass.B;
Aber sowohl Objekt bedürfen einander, um zu funktionieren und wenn ich Sie erstellt eine neue Instanz eines der beiden Objekte vor dem anderen erstellt wird, werden die lokalen Variablen in der "oberen" Klassen auf null gesetzt. Gibt es irgendwelche Konzepte, die in Java würde die Referenz das eigentliche Objekt (wie einen Zeiger) auf das Objekt als variable statt erstellen einer Kopie des Objekts?
- Sprechen Sie über schlechtes design..
- (ObPlead : Bitte, bitte, bitte nicht verwenden veränderlich Statik (früher bekannt als "globals"). Und das beinhaltet die Verwendung des singleton-antipattern.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Antwort, die du suchst, ist ein "singleton-pattern". Dies ist, wo Sie erstellen Sie einfach eine Instanz einer Klasse, die für die Nutzung an anderen Orten. Hier ist ein guter link zum Lesen. Hier ist die wikipedia-Seite über ihn mit einigen java-Beispiele.
So würde der code in etwa so Aussehen:
Dann, wo immer Sie wollen zu bekommen eine Instanz Ein, die Sie tun würde, so etwas wie:
Gibt keinen Grund, warum
A
könnte nicht auch eine Instanz vonB
- und call -B
's Methoden in seine eigenen Methoden. Was können Sie tun, mit dieser Kreuz-Abhängigkeit ist, rufen Sie eine der anderen Methoden im Konstruktor.Im Allgemeinen durch die Art und Weise, diese Muster sollten nur sparsam verwendet werden. Einen besseren Weg, dies zu erreichen ist durch dependency injection anstelle von globalen Referenzen. Cross-Injektion ist möglich, aber wieder, es sollte sparsam verwendet werden. Eine bessere Lösung wäre die Umgestaltung der Klassen zu linearen Abhängigkeiten.
Java ist pass-by-value, sondern der Wert eines Objekts ist eine Referenz auf das Objekt (ähnlich wie Zeiger in C, obwohl Sie nicht eine Speicher-Adresse). Also, wenn Sie eine Instanz von
A
und weisen Sie ihn auf ein anderes Feld, wird das Feld den gleichen Wert und verweist Sie auf die gleiche Instanz vonA
.Eigentlich Java hat nur Referenzen. Eine variable nicht ein Objekt enthalten, so dass keine sorgen gibt.
Auch, anstatt das zu tun,
Ich würde vorschlagen, Sie betrachten Sie dabei einen statischen import:
Wenn Sie eine Referenz in Java sind Sie eigentlich so eine Kopie einer Referenz. Sie sind nicht zu kopieren
Baseclass.B
in deinem Beispiel. Sie kopieren eine Referenz zuBaseclass.B
.In der Beispiel-code, den Sie zur Verfügung gestellt haben,
b
wird null, bisBaseclass.B
definiert ist. Wenn Sie eine operation aufb
können Sie nicht tun es in der Erklärung derClassA
. Sie brauchen, um es in eine Methode, die aufgerufen wird, nachdem Objekta
erstellt wurde.Dies ist eine klassische Anwendung für ein singleton.
Für jeden:
singleton.
Sehen wikipedia:Singleton-Muster.
Machen den Konstruktor von Konstrukt B auch, indem Sie eine getThe() auf.
Verwenden Sie außerdem keine öffentlichen Felder in
Baseclass
; stattdessen nutzen Sie die öffentlichen getter-Methoden. Nicht halten eine separate variable B; stattdessen bitten die Ein singleton für Sie.Wenn Sie dies tun:
Wirklich Sie sind ponting am gleichen Objekt ein, es ist, weil die "b" - variable namens-Referenz-Variable.
Über Ihre Frage, meine Empfehlung ist etwas wie das hier tun:
Ersten encapsule die Referenz:
Zweite Verwendung einer static-block für die init der Variablen: