2009-10-29 2 views
38

как инициализировать частный статический член класса в java.статическая инициализация переменных java

пытается следующее:

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

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

но на создание второго объекта класса А, а затем вызов f1(), я получаю исключение нулевого указателя.

+0

вы должны использовать открытый конструктор –

+0

ok ввести ошибку. –

+1

На какой строке кода вы получаете исключение null-указателя? –

ответ

68

Предпочтительные способы инициализации статических членов, либо (как упоминалось выше)

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

или для более сложного кода инициализации вы может использовать статический блок инициализатора:

private static final B a; 

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

Я использовал статический блок инициализатора, поскольку конструктор B выдает исключение. все же я получаю ту же ошибку. первый вызов функции библиотеки работает, но не второй. –

+2

Как я вижу, предпочтительный способ инициализации статических элементов зависит от реальной ситуации. Программное обеспечение, которое создает * все * статические элементы через этот шаблон, получает удар производительности при запуске приложения. Для нетривиальных ситуаций я предпочитаю ленивую схему инициализации именно по этой причине. – rsp

+1

@ rsp: Вы правы с точки зрения производительности (чтобы быть верным, это не при запуске, но когда класс загружен, хотя это может быть одним и тем же, но не обязательно). Я бы по-прежнему рассматривал этот способ инициализации статического члена как предпочтительный, поскольку инициализация лениво добавляет сложности в код - этого следует избегать, кроме как по уважительной причине. Одной из таких причин может быть производительность. – sfussenegger

4

Ваш код должен работать. Вы уверены, что разместили свой точный код?


Вы также можете инициализировать его более непосредственно:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

     void f1() { 
     b.func(); 
     } 
    } 
Смежные вопросы