我读过许多论坛和帖子,都讨论了用Java实现单调模式的不同风格,似乎"枚举是在Java中实现单调模式的最佳方法"!
我想知道如何使用Java枚举在具有延迟加载功能的Java中实现SingleTone模式。 因为枚举只是类。 第一次使用类时,它会由JVM加载,并完成所有静态初始化。 枚举成员是static,因此都将被初始化。
有谁知道我如何使用带有延迟加载支持的枚举?
您对延迟加载的一小句话未提及的是,JVM以线程安全的方式进行了延迟加载。 这就是为什么使用这种惰性类加载是首选方法的原因-JVM处理所有同步。
Java的可能重复项:延迟初始化Singleton
您阅读的消息人士说这是做懒惰单身人士的最简单方法的原因是因为它应该可以正常工作。 尝试这个:
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.
The first time a class is used, it gets loaded by the JVM and all of its static initialization is done. the enum members are static , so they're all going to be initialized.
实际上,类加载器仅在您首次访问此类后才加载类(听起来很有趣)。 访问enum-singleton类的唯一原因就是获取它的实例。
这就是为什么Java中的单元素枚举类型单调称为惰性的原因-在首次访问它之前,不会初始化其值。
类似问题:
Java:懒惰初始化Singleton
延迟加载的单例:双重检查锁定与按需持有人习惯用法的初始化
谢谢您的解释。 这里还有更多:为什么枚举单例