当前位置: 首页 > 知识库问答 >
问题:

单例通过枚举方式惰性初始化吗?

司徒俊良
2023-03-14
public enum enumClazz{
   INSTANCE
   enumClazz(){
     //do something
   }
}

很多地方都说这是一个懒惰的初始化。但是,当我阅读了“在Java虚拟机内部”的第7章--类型的生存期后,我感到困惑:

Java虚拟机规范在类和接口加载和链接的时间上给了实现灵活性,但严格定义了初始化的时间。所有实现都必须在每个类或接口的第一次活动使用时对其进行初始化。以下六种情况属于有效用途:

  • 创建一个类的新实例(在字节码中,新指令的执行。或者,通过隐式创建、反射、克隆或反序列化。)
  • 声明的静态方法的调用(在字节码中,invokestatic指令的执行)
  • 使用或分配由类或接口声明的静态字段,但由编译时常量表达式(在字节码中,getstatic或putstatic指令的执行)初始化的final static字段除外
  • Java API中某些反射方法的调用,例如class class中的方法或Java.lang.reflect包中的类中的方法
  • 类的子类的初始化(类的初始化要求其超类的初始化。)
  • 当Java虚拟机启动时,将类指定为初始类(使用main()

如果我的理解不对,有人能纠正我吗?

共有1个答案

冯祺
2023-03-14

枚举实例字段不是“由编译时常量表达式初始化的”。它们不可能是,因为只有string和基元类型是编译时常量表达式的可能类型。

这意味着类将在首次访问实例时初始化(这正是所需的效果)。

上面粗体文本中的异常存在,因为这些常量(静态final字段用编译时常量表达式初始化)将在编译期间有效地内联:

class A {
  public static final String FOO = "foo";

  static {
    System.out.println("initializing A");
  }
}

class B {
  public static void main(String[] args) {
    System.out.println(A.FOO);
  }
}
 类似资料:
  • 问题内容: 这是一个非常广泛的枚举单例代码: 一堆地方说这是一个懒惰的初始化。但我很困惑我“读的第7章后,里面的Java虚拟机 ” -一个类型的生命周期: Java虚拟机规范在类和接口加载和链接的时间上为实现提供了灵活性,但严格定义了初始化的时间。所有实现都必须在首次使用时初始化每个类或接口。以下六种情况可作为有效使用: 将创建一个类的新实例(以字节码表示,一条新指令的执行。或者,通过隐式创建,反

  • 延迟初始化 是一种允许我们延迟初始化消耗资源比较大的进程,直到需要他们的时候(才初始化)。这其中的一个例子就是jQuery的.ready()方法,它在DOM节点加载完毕之后会执行一个回调方法。 $( document ).ready( function () { //ajax请求不会执行,直到DOM加载完成 var jqxhr = $.ajax({ url: "ht

  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 问题内容: 我正在使用JPA(Hibernate作为我的JPA提供程序)。我实际上是在尝试避免hibernate细节并使用JPA规范。我有一个初始化惰性实体的函数。不幸的是,它使用了Hibernate特定的功能。这是我的功能: 是否有任何纯JPA方式初始化实体? 问题答案: 似乎没有一种初始化实体的标准方法。 有一种标准的方法可以检查是否已初始化(完全加载)实体,这是通过PersistenceUn

  • 问题内容: 创建单例的模式似乎是这样的: 但是我的问题是,如果Singleton构造函数执行的不是单元测试友好的操作,例如如何调用外部服务,jndi查找等,您如何使用这样的类进行单元化? 我想我可以像这样重构它: 现在的问题是,仅出于单元可测试性,我已强制将getInstance同步,因此仅出于测试方面,它将对实际应用程序产生负面影响。有没有解决的办法,由于Java中双重锁定模式的破坏性,似乎其他