我有一个如下所示的实用程序类:
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
时运行,我立即执行此操作。我也尝试使变量non-final满足条件“a non-constant static field is used
”。
我可以使用init方法同样在Why doesn't my static block of code execute?的另外两个问题中使用,但我仍然想知道为什么它不起作用,尽管我似乎已经满足了条件来自语言规范。
答案 0 :(得分: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");
}
}
每次构造类时都会调用初始化块。
静态初始化块仅在程序开始时调用一次。