我发现了三种单例模式的实例化方法,但我对它们中是否有最佳方法存在疑虑。我正在多线程环境下使用它们,并且希望采用延迟初始化。
示例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;
}
我正在使用的项目在各处都使用Sample 2,但我更喜欢Sample 3。还有枚举版本,但我不太明白它。
问题是,在哪些情况下我应该/不应该使用这些变体?虽然我不想要冗长的解释(关于这个问题已经有很多其他话题了,但它们最终都变成了争论),我希望用简短的话说明白。
public class MyClass { public enum ClassName { INSTANCE; // 我应该把所有的方法都放在这里吗,而不是像平常一样放在下面? } // 还是像平常一样放在下面? }
编辑:该死,注释没有格式化??讨厌! - jurchiksClassName.INSTANCE.doSomething(foo)
访问它们。 - Bozhosynchronized
。 - Bozho