【发布时间】:2013-05-22 04:53:30
【问题描述】:
这是一个非常普遍的枚举单例代码:
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
还有一堆地方说是惰性初始化。但是我读了'Inside the Java Virtual Machine'的第7章后感到困惑——类型的生命周期:
Java 虚拟机规范给出了实现 类和接口加载和链接时间的灵活性, 但严格定义了初始化的时间。所有实现 必须在第一次主动使用时初始化每个类或接口。这 以下六种情况符合主动使用条件:
- 创建了一个类的新实例(在字节码中,新指令的执行。或者,通过隐式创建, 反射、克隆或反序列化。)
- 类声明的静态方法的调用(在字节码中,invokestatic 指令的执行)
- 类或接口声明的静态字段的使用或赋值,但最终的静态字段除外并由 编译时常量表达式(在字节码中,执行 getstatic 或 putstatic 指令)
- Java API 中某些反射方法的调用,例如 Class 类或 java.lang.reflect 中的类中的方法 包
- 类的子类的初始化(类的初始化需要先对其超类进行初始化。)
- 在 Java 虚拟机启动时将一个类指定为初始类(使用 main()
第三点加粗说明如果字段为static final,则该字段的初始化发生在编译时。同样,enumClazz 中的INSTANCE 隐式等于public static final 并符合第三点。
如果我的理解有误,有人可以纠正我吗?
【问题讨论】: