2013-03-27 4 views
0

У меня есть класс, который выглядит следующим образом:Статический блок не запуская

public final class MyUtils { 

    public static final List<String> MY_VALUES = new ArrayList<String>(); 

    { 
     MY_VALUES.add("foo"); 
     MY_VALUES.add("bar"); 
    } 
} 

Я называю это из другого класса так же, как это:

MyUtils.MY_VALUES 

Если я делаю так, список пустой, и если я отлаживаю, я вижу, что статический блок никогда не запускается.

Как я понимаю из ответов на вопросы When does static class initialization happen? и How to force a class to be initialised? блок должен работать, когда a static field of the class is assigned, что я сейчас делаю. Я также попытался сделать переменную нефинал для выполнения условия «a non-constant static field is used».

Я мог бы использовать метод init, также содержащийся в двух других вопросах и als в Why doesn't my static block of code execute?, но я все равно хотел бы понять, почему он не работает в первую очередь, хотя я, кажется, выполнил условия с языка Спецификация.

ответ

8

Вы должны добавить static ключевое слово в передней части блока, чтобы сделать его статическим:

public final class MyUtils { 

    public static final List<String> MY_VALUES = new ArrayList<String>(); 

    static { 
     MY_VALUES.add("foo"); 
     MY_VALUES.add("bar"); 
    } 
} 

инициализации блока вызывается каждый раз, когда класс построен.

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

+0

Это работает, спасибо. Будет несколько минут, пока я не смогу принять ваш ответ. Не могли бы вы объяснить, какова разница с конструкцией без ключевого слова 'static'? Я использовал это раньше, и он всегда работал до сих пор (например, если я вызываю статические методы, раньше этот блок выполнялся). –

+0

См. Мой отредактированный ответ выше –

+0

Awesome tip, thx – Jason

Смежные вопросы