Supportnet / Forum / Anwendungen(Java,C++...)
[Java] Klassenvariable zurücksetzen
Frage
Mahlzeit!
nehmen wir mal an, in meinem Programm gibt es in einer Klasse die Klassenvariable String v = "s". Wenn ich zur Lebenszeit eines Objektes die Klassenvariable in v = "d" ändere, und nach Vernichtung des Klassenobjektes (null setzen) eine neue Instanz generiere, ist v = "d". Das ist soweit noch OK.
Problem: Wenn ich es aber für notwendig halte, eine Instanz der Klasse zu generieren, die wieder den originalen Klassenzustand wie beim erstmaligen benutzen hat ist das scheinbar nicht möglich. Gibt es dafür doch noch eine Lösung?
DANKE!
Antwort 1 von mr_x_hacker
Hi,
Du benutzt paar nicht ganz verständliche Ausdrücke...
Was ist ein Klassenobjekt? Eine Instanz dieser Klasse nehme ich mal an...
Null setzen ist nicht gleichbedeutend mit "vernichten" - der GarbageCollector räumt es irgendwann weg, wenn es keiner mehr braucht, aber das muß nicht sofort nach " o = null; " der Fall sein...
Du sprichst von Klassenvariablen - meinst also eine "static"-Variable, ja? Diese werden genau einmal initialisiert, und zwar beim Laden der Klasse (nicht Anlegen eines Objektes!) durch den Classloader... danach nie wieder, d.h. Du mußt sie manuell zurücksetzen, wenn sie wieder ihren Anfangswert haben soll...
Wann soll sie denn zurückgesetzt werden? Beim Zerstören eines Objektes? Dafür gibt es finalize()...
Ansonsten erkläre bitte noch mal deutlicher, was es werden soll :)
Ciao Sascha
Du benutzt paar nicht ganz verständliche Ausdrücke...
Zitat:
nach Vernichtung des Klassenobjektes (null setzen)
nach Vernichtung des Klassenobjektes (null setzen)
Was ist ein Klassenobjekt? Eine Instanz dieser Klasse nehme ich mal an...
Null setzen ist nicht gleichbedeutend mit "vernichten" - der GarbageCollector räumt es irgendwann weg, wenn es keiner mehr braucht, aber das muß nicht sofort nach " o = null; " der Fall sein...
Du sprichst von Klassenvariablen - meinst also eine "static"-Variable, ja? Diese werden genau einmal initialisiert, und zwar beim Laden der Klasse (nicht Anlegen eines Objektes!) durch den Classloader... danach nie wieder, d.h. Du mußt sie manuell zurücksetzen, wenn sie wieder ihren Anfangswert haben soll...
Wann soll sie denn zurückgesetzt werden? Beim Zerstören eines Objektes? Dafür gibt es finalize()...
Ansonsten erkläre bitte noch mal deutlicher, was es werden soll :)
Ciao Sascha
Antwort 2 von Binärchaot
Hi mr_x_hacker,
vielen Dank für Deine Antwort. Du hast ja alles richtig verstanden.
Klassenobjekt = Objekt einer Klasse = Instanz
Das mit dem Garbage-Collector und der Speicherbereinigung ist mir bekannt. Allgemein zu meiner Arbeit: Mir geht es darum, dass beim erneuten Öffnen eines Fensters alles neu initialisiert wird. Um die Kontrolle über die Objekte zu haben entwerfe ich alles mit Singleton-Mustern...
Klassenvariable = static
Kann man den Classloader dazu bringen die Klasse erneut zu laden und somit die static-Variablen wieder in den Ursprungszustand zurückversetzen?
Vielen Dank vorab!
vielen Dank für Deine Antwort. Du hast ja alles richtig verstanden.
Klassenobjekt = Objekt einer Klasse = Instanz
Das mit dem Garbage-Collector und der Speicherbereinigung ist mir bekannt. Allgemein zu meiner Arbeit: Mir geht es darum, dass beim erneuten Öffnen eines Fensters alles neu initialisiert wird. Um die Kontrolle über die Objekte zu haben entwerfe ich alles mit Singleton-Mustern...
Klassenvariable = static
Kann man den Classloader dazu bringen die Klasse erneut zu laden und somit die static-Variablen wieder in den Ursprungszustand zurückversetzen?
Vielen Dank vorab!
Antwort 3 von mr_x_hacker
Hi,
klingt kompliziert... man kann vermutlich irgendwie einen eigenen Classloader schreiben, und mit dem eine Klasse manuell laden... was der aber tut, wenn sie eigentlich schon vom SystemClassloader geladen wurde, weiß ich grade nicht...
Wie wäre es denn mit einer static init()-Methode, die Deine Werte wieder zurücksetzt, Singleton-Instanzen neu anlegt, etc...? Die rufst Du dann einfach auf, und fertig...
Überhaupt:
Ich verstehe zwar nicht genau, über was Du die Kontrolle haben willst, aber wenn Du Klassen neu laden willst, um Werte zu resetten, hast Du vielleicht bischen zu viel "static" gemacht oder so? :) Also für sowas gibt es eben grade Objekte und Instanzvariablen...
Ciao Sascha
klingt kompliziert... man kann vermutlich irgendwie einen eigenen Classloader schreiben, und mit dem eine Klasse manuell laden... was der aber tut, wenn sie eigentlich schon vom SystemClassloader geladen wurde, weiß ich grade nicht...
Wie wäre es denn mit einer static init()-Methode, die Deine Werte wieder zurücksetzt, Singleton-Instanzen neu anlegt, etc...? Die rufst Du dann einfach auf, und fertig...
Überhaupt:
Zitat:
Um die Kontrolle über die Objekte zu haben entwerfe ich alles mit Singleton-Mustern...
Um die Kontrolle über die Objekte zu haben entwerfe ich alles mit Singleton-Mustern...
Ich verstehe zwar nicht genau, über was Du die Kontrolle haben willst, aber wenn Du Klassen neu laden willst, um Werte zu resetten, hast Du vielleicht bischen zu viel "static" gemacht oder so? :) Also für sowas gibt es eben grade Objekte und Instanzvariablen...
Ciao Sascha

