2009-10-29 26 views
38

wie ein privates statisches Mitglied einer Klasse in Java zu initialisieren.statische Variable Initialisierung Java

versucht, die folgende:

public class A { 
    private static B b = null; 
    public A() { 
     if (b == null) 
     b = new B(); 
    } 

    void f1() { 
     b.func(); 
    } 
} 

aber auf ein zweites Objekt der Klasse A zu schaffen und dann rufen f1(), erhalte ich eine Null-Zeiger Ausnahme.

+0

sollten Sie einen öffentlichen Konstruktor verwenden –

+0

ok Tippfehler. –

+1

Auf welcher Codezeile erhalten Sie die Nullzeigerausnahme? –

Antwort

68

die bevorzugte Art und Weise statische Mitglieder sind entweder initialisiert werden (wie bereits erwähnt)

private static final B a = new B(); // consider making it final too 

oder für komplexere Initialisierungscode Sie könnte einen statischen Initialisiererblock verwenden:

private static final B a; 

static { 
    a = new B(); 
} 
+2

Ich habe einen statischen Initialisierungsblock verwendet, da der Konstruktor von B eine Ausnahme auslöst. Trotzdem bekomme ich den gleichen Fehler. Der erste Aufruf der Bibliotheksfunktion funktioniert, aber nicht der zweite. –

+2

Wie ich es sehe, hängt die bevorzugte Art der Initialisierung statischer Elemente von der tatsächlichen Situation ab. Software, die * alle * statische Mitglieder über dieses Muster erzeugt, erleidet beim Start der Anwendung einen Leistungseinbruch. Für nicht-triviale Situationen favorisiere ich aus diesem Grund ein faules Initialisierungsmuster. – rsp

+1

@rsp: Sie haben Recht mit Ihrem Leistungsbedenken (um richtig zu sein, es ist nicht beim Start, aber wenn die Klasse geladen ist - das könnte das gleiche sein, muss aber nicht sein). Ich würde immer noch diese Art der Initialisierung statischer Member bevorzugen, da die Initialisierung die Komplexität des Codes träge macht - dies sollte jedoch aus gutem Grund vermieden werden. Leistung könnte ein solcher Grund sein. – sfussenegger

4

Ihr Code sollte funktionieren. Sind Sie sicher, dass Sie Ihren genauen Code veröffentlichen?


Man könnte es auch initialisieren mehr direkt:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

     void f1() { 
     b.func(); 
     } 
    } 
Verwandte Themen