public class CachingEnumResolver {
private static Map CODE_MAP_CACHE;
private static CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();
static {
CODE_MAP_CACHE = new HashMap();
CODE_MAP_CACHE.put( "0", "北京市" );
}
public static CachingEnumResolver getInstance() {
return SINGLE_ENUM_RESOLVER;
}
public void initEnums() {
if( null == CODE_MAP_CACHE ) {
System.out.println( "CODE_MAP_CACHE为空,问题在这里开始暴露." );
CODE_MAP_CACHE = new HashMap();
}
CODE_MAP_CACHE.put( "1", "北京市" );
CODE_MAP_CACHE.put( "2", "云南省" );
}
public CachingEnumResolver() {
initEnums();
}
public Map getCache() {
return Collections.unmodifiableMap( CODE_MAP_CACHE );
}
public static void main(String[] ars){
CachingEnumResolver resolver = CachingEnumResolver.getInstance();
Map map = resolver.getCache();
for( Object key : map.keySet() ) {
System.out.print( key+"------------->" );
System.out.print( map.get( key ));
}
}
}
结果:
CODE_MAP_CACHE为空,问题在这里开始暴露.
0------------->北京市
看了一篇文章《神秘的类和对象初始化过程》,又熟悉了一遍关于jvm加载类的实现过程。总结了一下关于类的加载顺序:
开始
1.静态字段
2.静态块
//如果你的调用为new,则继续执行下面的。如果没有new,而是通过静态方法第一次访问该类,则到此处就返回了。
3.字段(非静态块)
4.构造函数
返回
父类1-->父类2-->子类1-->子类2-->父类3-->父类4-->子类3-->子类4
(以上说明先类的后对象的.在此基础上先父类,后子类)-->先类先父
根据上面的例子说明一下:上面刚刚初始化静态字段的时候就有new的调用,所以先调用构造函数来执行。完成后执行静态块把原来赋好的值给覆盖掉了,结果才出现那种情况。