Sud*_*oer 2 java initialization static-members
我有一个关于初始化的有趣问题.我有以下代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我打电话时ErrorLookupProvider.getInstance(),我打了一个NPE.里面的地图init()没有用new初始化HashMap.
如果我将声明更改map为final,那么我会看到它已初始化.或者,即使我删除静态并使其成为私有类变量private Map<.....>也是如此.
我无法弄清楚为什么会这样.有人能解释一下这里发生了什么吗?
切换地图和单例实例初始化的顺序.
静态初始化按源在源中遇到的顺序发生.
参见JLS 12.4.2详细初始化程序,步骤6(final部分)和9("顺序"部分).
(单独的实现和在静音中的静态问题,单独的问题.)
| 归档时间: |
|
| 查看次数: |
1953 次 |
| 最近记录: |