Java 具有延迟加载功能的单元素枚举类型单音

Java 具有延迟加载功能的单元素枚举类型单音,java,jakarta-ee,design-patterns,jvm,singleton,Java,Jakarta Ee,Design Patterns,Jvm,Singleton,我读了很多论坛和帖子,介绍了在java中实现单音模式的不同风格,似乎“Enum是在java中实现单音模式的最佳方式”!! 我想知道如何使用javaenum在Java中实现具有延迟加载功能的单音模式。因为枚举只是类。第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化 有人知道如何使用支持lazyloading的enum吗? 第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化 实际上,classloader只有在

我读了很多论坛和帖子,介绍了在java中实现单音模式的不同风格,似乎“Enum是在java中实现单音模式的最佳方式”!! 我想知道如何使用javaenum在Java中实现具有延迟加载功能的单音模式。因为枚举只是类。第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化

有人知道如何使用支持lazyloading的enum吗?

第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化

实际上,classloader只有在您第一次访问这些类之后才加载这些类(听起来很有趣)。访问enum singleton类的唯一原因是获取它的实例

这就是为什么Java中的单元素枚举类型singletone被称为惰性——它的值在您第一次访问它之前没有初始化

类似问题:

你读到的消息来源说,这是最容易实现懒惰单例的方法,因为它应该可以正常工作。试试这个:

public class LazyEnumTest {
  public static void main(String[] args) throws InterruptedException {
    System.out.println("Sleeping for 5 seconds...");
    Thread.sleep(5000);
    System.out.println("Accessing enum...");
    LazySingleton lazy = LazySingleton.INSTANCE;
    System.out.println("Done.");
  }
}

enum LazySingleton {
  INSTANCE;
  static { System.out.println("Static Initializer"); }
}
以下是我在控制台中得到的输出:

$ java LazyEnumTest
Sleeping for 5 seconds...
Accessing enum...
Static Initializer
Done.

关于延迟加载,您的小引文没有提到的是JVM以线程安全的方式进行延迟加载。这就是为什么使用这种惰性类加载是JVM处理所有同步的首选方法。感谢您的精彩解释。这里还有一些: