具有延迟加载能力的单元素枚举类型单例

时间:2013-03-18 05:45:14

标签: java java-ee design-patterns jvm singleton

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

有谁知道我如何使用带有延迟加载支持的枚举?

2 个答案:

答案 0 :(得分:6)

  

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

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

这就是为什么Java中的单元素枚举类型单线程被称为 lazy - 它的值在您第一次访问它之前未初始化。

类似的问题:

答案 1 :(得分:6)

您阅读的消息来源说这是做懒惰单身的最简单方法的原因是它应该起作用。试试这个:

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.