【发布时间】:2011-06-10 00:35:09
【问题描述】:
我找到了三种实例化 Singleton 的方法,但我怀疑它们中的任何一种是否是最好的。我在多线程环境中使用它们并且更喜欢惰性实例化。
示例 1:
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
示例 2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
示例 3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
我使用 ATM 的项目到处都使用示例 2,但我更喜欢示例 3。还有 Enum 版本,但我就是不明白。
这里的问题是 - 在哪些情况下我应该/不应该使用这些变体?虽然我不是在寻找冗长的解释(还有很多其他主题,但最终都变成了争论 IMO),我希望用几句话就能理解。
【问题讨论】: