这是一个非常广泛的传播枚举单码:通过枚举方式的单例是懒惰初始化的?
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
和一堆地说,这是一个懒惰的初始化。
Java虚拟机规范给出实现的类和接口加载的时间 灵活性和链接, 但严格:一个类型的生命周期 - 但在我读的“Inside the Java Virtual Machine”第7章我很困惑定义了初始化的时间。所有实现 必须初始化每个类或接口的第一次活动使用。所述 以下六个情况资格作为活性的用途:
- 创建类的一个新实例(在字节码,一个新的指令的执行可替换地,经由隐式的创建, 反射,克隆,或反序列化。)。
- 由类声明的静态方法的调用(在字节码,一个invokestatic指令的执行)
- 通过一个类或接口中声明的静态域的使用或分配,除了静态字段是最终并由 初始化一个编译时常量表达式(在字节码中S,A getstatic或putstatic指令)的执行
- 的Java API中的某些反射的方法,如在类类方法或类在java.lang.reflect中调用 包
- 初始化一类的子类的(一类的初始化需要其超类的现有的初始化。)
- 一类的指定为初始类(与主()<法)时,Java虚拟机启动
第三点粗体显示,如果字段为static final
,则该字段的初始化在编译时发生。同样,INSTANCE
的enumClazz
隐含地等于public static final
并符合第三点。
如果我的理解错误,有人能纠正我吗? “
类辛格尔顿{公共静态最终instance = new Singleton(); ...}那么,对于泛型类的方式,这个“实例”是否被惰性初始化? –
是的,它会以相同的方式懒惰地初始化。 – assylias
全部清除。感谢一堆:) –