Singleton Design Pattern及其子类的默认构造函数

时间:2012-10-19 17:40:23

标签: java

在我的编码中,我使用Singleton类和Singleton Design Pattern。问题是为什么它的子类不允许使用默认构造函数?

我得到编译时错误:

Implicit super constructor Singleton() is not visible. Must explicitly invoke another constructor

Singleton.java

public class Singleton {
    private static Singleton singleton;

    private Singleton() {
        System.out.println("I am user class");
    }

    public static Singleton getInstance() {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}

SubClass.java

public class SubClass extends Singleton {
    public SubClass(){
        System.out.println("I am sub class");
    }
}

4 个答案:

答案 0 :(得分:6)

当您创建SubClass的实例时,它会自动调用其constructor的{​​{1}}来初始化其字段,并进一步调用SuperClass中的所有超类构造函数}

既然你的inheritance hierarchy构造函数是私有的,所以它不能调用它。所以,你得到了那个例外..

SuperClass subclass类没有意义,因为在这种情况下,singleton

您应该your class will no longer be singleton关于re-think以及您要做的事情。并相应地design你的设计。

答案 1 :(得分:2)

SingleTon类不应该被继承,所以下面确保

private Singleton() {

代码

public SubClass(){
    System.out.println("I am sub class");
}

与:

相同
public SubClass(){
    super(); //Error here as super class constructor is private
    System.out.println("I am sub class");
}

答案 2 :(得分:1)

因为Singleton类no-arg构造函数是private。实例化子类时,它也尝试实例化超类。但是你的超级类有私人构造函数。它失败了。

 private Singleton() {
        System.out.println("I am user class");
    }

继承Singleton类是没有意义的。您可能需要重新考虑您的设计。

答案 3 :(得分:1)

首先,对单例类进行子类化打破了Singleton Pattern.的基础知识 其次,由于通过继承树调用构造函数的链,因为父类的构造函数是private,所以会得到该异常。

您可能会添加一个带有一些参数的公共构造函数,以使子级继承自其父级。那么你可能会有很多SubClass个实例。任何Subclass实例 IS-A Singleton实例也是如此。这违反了Singleton模式的目的。这就是为什么你应该避免继承单例类的原因。