Java 具有延迟加载功能的单元素枚举类型单音
我读了很多论坛和帖子,介绍了在java中实现单音模式的不同风格,似乎“Enum是在java中实现单音模式的最佳方式”!! 我想知道如何使用javaenum在Java中实现具有延迟加载功能的单音模式。因为枚举只是类。第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化 有人知道如何使用支持lazyloading的enum吗? 第一次使用类时,JVM将加载该类并完成其所有静态初始化。枚举成员是静态的,因此它们都将被初始化 实际上,classloader只有在您第一次访问这些类之后才加载这些类(听起来很有趣)。访问enum singleton类的唯一原因是获取它的实例 这就是为什么Java中的单元素枚举类型singletone被称为惰性——它的值在您第一次访问它之前没有初始化 类似问题: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只有在
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处理所有同步的首选方法。感谢您的精彩解释。这里还有一些: