在我的编码中,我使用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");
}
}
答案 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模式的目的。这就是为什么你应该避免继承单例类的原因。