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