Klar Singleton-Instanz in Java
Habe ich eine Singleton-Klasse zum speichern des Status eines Anwendung-Modul.
Diese Klasse einfach eine Menge von class-Variablen mit setter und Getter :
public class ModuleState{
private static ModuleState instance;
private A a;
private B b;
private C c;
..
..
..
..
private ModuleState (){}
public ModuleState getInstance(){
if(instance==null)
instance=new ModuleState();
return instance;
}
}
Zu einem bestimmten Zeitpunkt in den application lifecycle, ich habe den LÖSCHEN müssen Sie das Modul state. Was ich tun ist jetzt zurücksetzen, um ALLE Variablen in ModuleState durch ein clearAll () - Methode wie diese:
public void clearAll(){
a=null;
b=null;
c=null;
..
..
}
Meine Frage ist folgende : gibt es eine sauberere Methode, dies zu tun-reset? Möglicherweise clearing die singleton-Instanz selbst, ohne zurücksetzen jeder Klasse die variable?
Das problem bei diesem Ansatz ist, dass ich vielleicht das Bedürfnis haben, fügen Sie eine neue Klasse variable, die ModuleState. In diesem Fall muss ich daran denken, fügen Sie eine Zeile in der clearAll () - Methode zum zurücksetzen der neuen variable.
InformationsquelleAutor Nameless | 2013-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ...
p.s.: als pro Diskussion unten: in einer Multithread-Umgebung ist es sehr wichtig zu synchronisieren, die Zugriff auf die Instanz, weil die JVM darf cache seinen Wert. Sie können
volatile
wie oben gezeigt. Vielen Dank an alle!Prost!
Ja, Sie haben Recht: es ist ein bisschen gegen die Idee eines Singleton. Darüber hinaus kann es notwendig sein, synchronisieren Sie diese Methode. Aber noch funktionsfähig ist, ist es nicht?
Es hat zum cache ist es irgendwie. Einfach anrufen ModuleState.getInstance().getA().getFoo() hat noch eine chance auf eine veraltete Zustand, wenn ein anderer thread verpasst dem singleton-parallel. Machen getInstance() synchronisiert, ändert sich nichts.
Das gleiche unsafety argument kann dann für einzelne Objekte zurückgegeben
getA..Z
, so offensichtlich einige praktische Begrenzung "Präzision" muss akzeptiert werden. Macheninstance
flüchtig und mit diesem Ansatz ist wahrscheinlich eine sehr anständige Lösung zu OP ' s problem.Den nur letztlich sichere Lösung ist ein massive-Klasse, die nie stellt der
A..Z
Objekte, sondern können nur abgefragt werden, für die Blatt-Atomare Werte, die Sie halten. Die ganze Klasse müsstesynchronized
so, dass die reset - Betrieb schließen sich gegenseitig aus jeder .InformationsquelleAutor Trinimon
Nein, dieser Ansatz ist durchaus akzeptabel. Sie sind natürlich die Synchronisierung der Zugang zu diesen Status-Objekte, die in irgendeiner Weise, richtig? sonst riskieren Sie, jemand zu sehen, eine halb-config-Objekt gelöscht.
andere Sache, die Sie tun können, um zu zukunftssicheren Sie sich gegen jede zusätzliche Staates, die in Zukunft aufgenommen ist, speichern Sie alle von Ihrem Staat in eine HashMap, zum Beispiel, statt der einzelnen Felder. auf diese Weise, clear()ing der hashmap wird sichergestellt, dass alle staatlichen ausgelöscht wird, und das hinzufügen der extra-Zustand in der Zukunft sicherer wird
InformationsquelleAutor radai
Müssen Sie halten die gleiche Objekt-Instanz, um im Einklang mit dem Singleton-pattern, so dass Ihr Ansatz macht Sinn: die änderung der Mitglieder.
Jedoch, wenn Sie wollte, es zu bereinigen ein wenig, warum nicht einfach eine interne Liste, wie:
Andere Möglichkeit wäre, ein
HashMap
, bindet das entscheidende Wort, an das Mitglied.Für eine
ArrayList
oder eineHashMap
, dieclearAll
Methode könnte wie folgt Aussehen:Diese Methode nicht brauchen, um zu ändern.
InformationsquelleAutor christopher
Werden können, dies kann Ihnen helfen:
InformationsquelleAutor gluckonavt
Machen Sie eine innere Klasse zu halten, die Felder, dann ersetzen , dass Beispiel, wenn Sie zurücksetzen möchten. Das schreiben auf dem Spielfeld würde das ändern, um alle drei Felder, die im wesentlichen atomar.
Durch die Art und Weise, Ihre null-überprüfung von code für die Initialisierung war nicht threadsicher. Ich fest, dass auch.
Beachten Sie, dass diese Arbeit zu machen, musst du den Verweis auf
values
flüchtig und synchronisieren Sie alle Zugang zu Ihr, ansonsten (aufgrund der java-memory-Modell) von anderen threads als dem, der ruft reset() kann sehen, dass die alte Referenz.Eigentlich ist es nicht alles erreichen, was mehr als der einfachere Weg, es ist nur erlaubt den client-cache "singleton". Aber es gibt keinen inneren Wert haben, die Art Protokoll: was ist falsch mit darauf, dass die singleton-werden immer neu erworben
getInstance
?danke für den thread-sicher beheben
Meinst du diesen, wenn Sie darüber gesprochen, "eine riesige Klasse, die nie stellt von A..Z-Objekte, aber Sie können nur abgefragt werden, für die Blatt-Atomare Werte, die Sie halten. Die ganze Klasse hätte synchronisiert werden, so dass der reset-Betrieb schließen sich gegenseitig aus, jeder" ? Durch die Art, wie ich diese Lösung irgendwelche Nachteile? Ist dies sicher?
InformationsquelleAutor Bohemian