我有一个关于初始化的有趣问题。我有以下代码:
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()
没有用 new 初始化HashMap
。
如果我将声明更改map
为最终的,那么我会看到它已初始化。或者,即使我删除了 static 并将其设为私有类变量,因为private Map<.....>
它也可以。
我一直无法弄清楚为什么会发生这种情况。有人可以解释这里发生了什么吗?