2009-10-29 10 views
38

comment initialiser un membre statique privé d'une classe dans java.initialisation de variable statique java

essayer ce qui suit:

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

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

mais sur la création d'un second objet de la classe A, puis en appelant f1(), je reçois une exception de pointeur nul.

+0

vous devez utiliser un constructeur public –

+0

ok faute de frappe. –

+1

Sur quelle ligne de code obtenez-vous l'exception du pointeur nul? –

Répondre

68

Les moyens préférés pour initialiser les membres statiques sont soit (comme mentionné précédemment)

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

ou pour le code d'initialisation plus complexe que vous pourrait utiliser un bloc d'initialisation statique:

private static final B a; 

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

J'ai utilisé un bloc d'initialisation statique comme le constructeur de B jette une exception. j'ai toujours la même erreur. le premier appel à la fonction de bibliothèque fonctionne mais pas le second. –

+2

Comme je le vois la manière préférée d'initialiser les membres statiques dépend de la situation réelle. Le logiciel qui crée * tous * les membres statiques via ce modèle subit une baisse de performance au démarrage de l'application. Pour des situations non triviales, je privilégie un modèle d'initialisation paresseux pour cette raison. – rsp

+1

@rsp: Vous avez raison avec votre souci de performance (pour être correct, ce n'est pas au démarrage mais quand la classe est chargée - ce qui peut être le même mais ne doit pas l'être). Je considérerais toujours cette façon d'initialiser le membre statique préféré car faire l'initialisation ajoute paresseusement de la complexité au code - ceci devrait être évité sauf pour une bonne raison. La performance pourrait être une telle raison. – sfussenegger

4

Votre code devrait fonctionner. Etes-vous sûr de poster votre code exact?


Vous pouvez également initialiser plus directement:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

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