1

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

我得到编译时错误:

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

单例.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;
    }

}

子类.java

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

4 回答 4

6

当您创建SubClassthen 的实例时,它会自动调用其constructor的实例SuperClass来初始化其字段,并进一步调用inheritance hierarchy

现在因为你的SuperClass构造函数是私有的,所以它不能调用它。所以,你得到了那个例外..

subclass但这对一个类没有意义singleton,因为在那种情况下,your class will no longer be singleton.

你应该re-think了解你design和你正在尝试做的事情。以及change相应的设计。

于 2012-10-19T17:42:26.190 回答
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");
}
于 2012-10-19T17:41:44.780 回答
1

因为您的Singleton类无参数构造函数是private. 当您实例化子类时,它也会尝试实例化超类。但是你的超类有私有构造函数。它失败。

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

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

于 2012-10-19T17:41:41.353 回答
1

首先,子类化一个单例类打破了基础。Singleton Pattern. 其次,由于通过继承树调用构造函数的链,由于父类的构造函数是private.

您可能会添加一个带有一些参数的公共构造函数,以使子代从其父代继承。然后你可能会有很多SubClass. 任何Subclass实例都是 IS-A Singleton实例。这违背了单例模式的目的。这就是为什么你应该避免子类化一个单例类。

于 2012-10-19T17:45:27.283 回答