【发布时间】:2012-06-15 23:02:29
【问题描述】:
我有一个关于初始化的有趣问题。我有以下代码:
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。 init() 内部的映射没有用新的HashMap 初始化。
如果我将map 的声明更改为最终声明,那么我看到它已初始化。或者,即使我删除了 static 并将其设置为 private Map<.....> 的私有类变量也可以。
我无法弄清楚为什么会发生这种情况。有人可以解释这里发生了什么吗?
【问题讨论】:
-
即使使用非长映射键也能编译吗?
-
我错了,我错过了 123L
标签: java initialization static-members