Lebensdauer von Objekten


lubu

Mitglied
Hi,

ich habe da mal ein ganz grundsätzliche Frage zu der Lebensdauer von Objekten und deren Initialisierung von Variablen.

Mein Problem:

Ich rufe ein Objekt im Hauptprogramm auf und habe einen Mechanismus, dass dieses nochmal erneut aufgerufen wird. Hintergrund ist, dass über diesen Weg ein erneutes Einlesen einer Konfigurationsdatei, Initialisierung der DB-Verbindung und dergleichen erneut statt finden soll.

Hier das kleine Startprogramm:

Code:
public class Example {

    public static void main(String args[]) {

            boolean bCheckReboot = false;
            do {
                new ExampleMain(args);
                // wenn eine besondere Bedingung eingetreten ist und
                // bCheckReboot true wird, erfolgt ein Neustart des  
                // Programms
                bCheckReboot = checkStopfile();
            }
            while (bCheckReboot);
    }
}

und im folgenden die Klasse in der eigentlich alles passiert:

Code:
public class ExampleMain {
    private static String version = "1.0.0";
    private static boolean bCheck = true;

    public ExampleMain(String args[]) {
        ...
        if (bCheck){
            bCheck = false;
            // macht hier noch andere Dinge
        }
        ...
        return;
    }
}

Das Problem: Durch den Loop in der main-Prozedur besteht die Möglichkeit das Hauptprogramm (die Klasse ExampleMain) erneut aufzurufen. Das funktioniert auch, allerdings werden die Klassenvariablen nicht mehr initialisiert, hier am Beispiel der Variablen bCheck. Diese wird beim zweiten Aufruf nicht auf true gesetzt.

In der main-Prozedur wird das Objekt mit new ExampleMain(args) instanziert und nachdem das Objekt beendet wurde, hätte ich erwartet, dass der GC dann dieses auch wegräumen würde. Bei dem erneuten Aufruf mit new ExampleMain(args) habe ich angenommen, dass dann auch das komplette Objekt neu im Speicher erzeugt wird und somit auch die Klassenvariablen neu initialisiert werden. (Wie gesagt: Wenn ich das Debugge ist das nicht der Fall. Die Variable bCheck hat dann den Wert false).

Habe ich da ein falsches Verständnis über die Lebensdauer von Objekten?

(Übrigens, eine programmtechnische Lösung ist hier nicht das Problem, da ich dann in ExampleMain die Variablen später nochmal initialisieren würde. Mir geht es ums Grundsätzliche).

Danke Lutz
 

Anime-Otaku

Erfahrenes Mitglied
So wie ich das sehe, wird bCheck beim ersten Aufruf auf false gesetzt und beim 2. Aufruf ist diese immer noch false, daher werden die Dinge unterm If nicht aufgerufen.
Da static Variablen für alle Objekte von diesem Typ gelten. Daher static weg und gut ist.

Nur nebenbei:
Warum machst du dafür ein Konstruktor?...Das ist etwas das normalerweise in eine static Methode kommt imo. Schließlich benutzt du das ja nicht als Variable.

Die version Variable würde ich als final deklarieren. Außer du änderst den String während das Programm läuft natürlich.(Wird dann komplett Großgeschrieben)
 

lubu

Mitglied
Hi,

erstmal schönen Dank für die Hinweise, die ich auch entsprechend umgesetzt habe.

Ich verstehe trotzdem noch nicht, warum die mit static deklarierten Variablen, nachdem das Objekt nicht mehr benötigt wird, sprich nach dem ersten Durchlauf in der main-Prozedur, bei der nächsten Erzeugung nicht mit (bCheck = true) initialisiert werden. Schließlich wird das Objekt im zweiten Durchlauf auch mit new erzeugt.

Tschau Lutz
 

Matze

Weltenwanderer
Eben weil sie static sind!
Statisch bedeutet, dass alle Objekte einer Klasse daruf zeigen.

Nimm das static doch mal raus ^^
 

Neue Beiträge