具有延迟加载能力的单元素枚举型单线态

Mor*_*Adi 4 java singleton jvm design-patterns java-ee

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

有谁知道如何使用enum与懒惰加载支持?

Dao*_*Wen 7

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

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"); }
}
Run Code Online (Sandbox Code Playgroud)

这是我在控制台中获得的输出:

$ java LazyEnumTest
Sleeping for 5 seconds...
Accessing enum...
Static Initializer
Done.
Run Code Online (Sandbox Code Playgroud)


bsi*_*nau 6

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

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

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

类似的问题: