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