我有一个关于初始化的有趣问题。我有以下代码:
public class ErrorLookupProvider {
private static final ErrorLookupProvider INSTANCE = new ErrorLookupProvider();
private static Map<Long, List<String>> map = new HashMap<Long, List<String>>();
private ErrorLookupProvider() {
init();
}
private void init() {
map.put(123L, ImmutableList.of("abc", "def"));
}
public static ErrorLookupProvider getInstance() {
return INSTANCE;
}
}
现在当我调用 ErrorLookupProvider.getInstance()
,我打了一个NPE。里面的 map init()
未使用新的 HashMap
初始化.
如果我更改 map
的声明最终,然后我看到它已初始化。或者,即使我删除 static 并将其设为私有(private)类变量 private Map<.....>
这也行。
我还没弄明白为什么会这样。有人可以解释这里发生了什么吗?
最佳答案
切换映射和单例实例初始化的顺序。
静态初始化按照它在源代码中遇到的顺序发生。
参见 JLS 12.4.2 Detailed Initialization Procedure 、第 6 步(final
部分)和第 9 步(“order”部分)。
(单独的问题,单独的问题。)
关于java - 加载类时未初始化静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059189/