2009-10-29 26 views
38

cómo inicializar un miembro estático privado de una clase en java.inicialización de variable estática java

tratar lo siguiente:

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

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

sino en la creación de un segundo objeto de la clase A y luego llamar f1(), recibo una excepción de puntero nulo.

+0

debe usar un constructor público –

+0

error de tipeo correcto. –

+1

¿En qué línea de código obtiene la excepción de puntero nulo? –

Respuesta

68

Las formas preferidas para inicializar los miembros estáticos son o bien (como se mencionó antes)

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

o para el código de inicialización más compleja que podría utilizar un bloque de inicializador estático:

private static final B a; 

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

utilicé un bloque de inicializador estático ya que el constructor de B arroja una excepción. aún recibo el mismo error. la primera llamada a la función de la biblioteca funciona pero no la segunda. –

+2

Como yo lo veo, la forma preferida de inicializar miembros estáticos depende de la situación real. El software que crea * todos * miembros estáticos a través de este patrón tiene un impacto en el rendimiento durante el inicio de la aplicación. Para situaciones no triviales, estoy a favor de un patrón de inicialización lento por esa misma razón. – rsp

+1

@rsp: tiene razón en su preocupación por el rendimiento (para ser correcto, no está en el inicio, pero cuando se carga la clase, que podría ser la misma, pero no necesariamente). Todavía consideraría esta manera de inicializar el miembro estático preferido, ya que hacer la inicialización agrega pereza complejidad al código; esto debería evitarse excepto por una buena razón. El rendimiento puede ser una de esas razones. – sfussenegger

4

Tu código debería funcionar. ¿Estás seguro de que estás publicando tu código exacto?


También puede inicializar de forma más directa:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

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