9

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

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

4

2 回答 2

9

您阅读的消息来源说这是做懒惰单例的最简单方法的原因是因为它应该可以工作。试试这个:

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.
于 2013-03-18T05:59:22.617 回答
8

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

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

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

类似的问题:

于 2013-03-18T05:56:12.970 回答