我找到了三种实例化 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。还有枚举版本,但我就是不明白。
这里的问题是——在哪些情况下我应该/不应该使用这些变体?不过,我并不是在寻找冗长的解释(还有很多其他主题,但它们最终都会变成争论 IMO),我希望用几句话就可以理解。
最佳答案
在 java 中实现单例的最安全和最简单的方法是使用枚举(就像你提到的那样):
public enum ClassName {
INSTANCE;
// fields, setters and getters
}
枚举语义保证只有一个INSTANCE
如果不使用枚举方法,则必须注意很多方面,例如竞争条件和反射。我一直在破坏某些框架的单例并滥用它们,因为它们没有正确编写。枚举保证没有人会破坏它。
关于java单例实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706216/