使用私有静态嵌套类实现Singleton



我目前正在学习Singleton模式。我了解到实现它的经典方法是创建一个Singleton类类型的静态字段,使用私有访问修饰符隐藏构造函数,并提供一个公共getInstance()方法。

然而,我想到了另一种不使用私有构造函数实现它的方法:

public class SWrapper {
    private static Singleton holder = new Singleton();
    private static class Singleton{ /* implementation without private constructor*/}
    public static Singleton getInstance() {
        return holder;
}

问题:这种实施有效吗?(我想是的,但我不能确定。)如果是的话,使用这个实现有什么优点或缺点吗?

它是一个单例,但它被急切地初始化(而不是懒惰地初始化),所以它没有那么有趣。使用名称holder表明您正在尝试按需初始化持有者习语

public class Singleton {
    private static class Holder {
        static final Singleton INSTANCE = new Singleton ();
    }
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
    private Singleton () {
    }
    // rest of class omitted
}

它在第一次获得时(而不是在加载类时)初始化singleton实例,但不需要任何特殊的同步来实现线程安全。

这不会起作用,因为您的Singleton类是私有的。这意味着您不能从SWrapper之外访问它的成员(当然,Object中定义的成员除外)。

公共类SingletonWithHelper{
private SingletonWithHelper(){}
//This is the most widely used approach for Singleton class as it doesn’t
//require synchronization.
private static class SingletonHelper{
    private static final SingletonWithHelper SINGLETON = new SingletonWithHelper();
}
public static SingletonWithHelper getInstance(){
    return SingletonHelper.SINGLETON;
}

}

最新更新