【发布时间】:2014-06-30 09:36:49
【问题描述】:
我阅读了很多关于 Singleton 的文章,其中大多数作者都说 Java 中 Singleton 的这种变体:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
不懒(那么渴望)。
但我不明白为什么,Singleton() 构造函数只会在 Singleton 类初始化时被调用。我知道有几个原因可以触发类初始化:
- 将
new与构造函数一起使用(但在这种情况下构造函数是私有的)。 - 访问或设置静态字段(此处为私有)。
- 使用静态方法。
- 有反射:
Class.forName("Singleton")。
所以这里我们的对象将只在使用静态方法getInstance()(我猜它仍然是LAZY初始化)和反射(但反射会破坏很多单例变化,除了@ 987654327@也许)。
也许我看不到明显的东西,请解释一下,我哪里错了?
【问题讨论】:
-
你的代码是懒惰创造的一个例子。只要没有其他方式使用你的类,正如你自己猜到的那样,它是按需延迟创建的(使用反射只是另一种要求初始化的方式)。所以你是对的。
-
这是我统治世界的计划:1) 更喜欢
enumSingleton 模式。 2) 意识到单例一开始是个坏主意,不管你如何实现它们。 3) 让人们了解 stackoverflow 为什么单例是一个坏主意。 4) 退休,在海滩上喝玛格丽塔酒。