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

时间:2015-04-01 15:40:41

标签: java design-patterns

我目前正在学习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;
}

问题:此实施是否有效? (我认为确实如此,但我无法确定。)如果确实如此,使用此实现有什么优点或缺点吗?

3 个答案:

答案 0 :(得分:1)

它是一个单身人士,但是它被急切地初始化(没有懒惰地初始化),所以它并不那么有趣。您使用名称holder表示您正在尝试使用Initialization-on-demand holder idiom

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
}

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

public class 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;
}

}