2009-10-29 22 views
38

come inizializzare un membro statico privato di una classe in java.inizializzazione variabile statica java

provare il seguente:

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

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

ma sulla creazione di un secondo oggetto della classe A e quindi chiamando f1(), ottengo un'eccezione di puntatore nullo.

+0

si dovrebbe usare un costruttore pubblico –

+0

ok errore di battitura. –

+1

Su quale riga di codice ottieni l'eccezione puntatore nullo? –

risposta

68

I modi preferiti per inizializzare membri statici sono o (come detto prima)

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

o per codice di inizializzazione più complesso si potrebbe utilizzare un blocco di inizializzazione statico:

private static final B a; 

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

ho usato un blocco di inizializzazione statico mentre il costruttore di B genera un'eccezione. ancora ottengo lo stesso errore. la prima chiamata alla funzione di libreria funziona ma non la seconda. –

+2

A mio avviso, il modo preferito di inizializzare i membri statici dipende dalla situazione attuale. Il software che crea * tutti * i membri statici tramite questo modello subisce un calo di prestazioni durante l'avvio dell'applicazione. Per situazioni non banali, preferisco uno schema di inizializzazione pigro proprio per questa ragione. – rsp

+1

@ rsp: Hai ragione riguardo al tuo rendimento in termini di prestazioni (per essere corretti non è in fase di avvio, ma quando la classe viene caricata - che potrebbe essere lo stesso ma non è necessario). Continuo a considerare che questo modo di inizializzare il membro statico preferito mentre l'inizializzazione aggiunge pigramente la complessità al codice - questo dovrebbe essere evitato tranne che per una buona ragione. Le prestazioni potrebbero essere una di queste ragioni. – sfussenegger

4

Il tuo codice dovrebbe funzionare. Sei sicuro di pubblicare il tuo codice esatto?


Si potrebbe anche inizializzare in modo più diretto:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

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