在我的编码中,我将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");
}
}
创建SubClass
实例时,它会自动调用其SuperClass
的constructor
以初始化其字段,并进一步调用inheritance hierarchy
现在,由于您的SuperClass
构造函数是私有的,因此无法调用。因此,您会得到例外。
,但是subclass
singleton
类是没有意义的,因为在这种情况下,your class will no longer be singleton
。
您应该 re-think
关于您的design
以及您要做什么。和change
相应的设计。
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");
}
,因为您的Singleton
类NO-ARG构造函数为private
。当您实例化子类时,它也尝试实例化超级类。但是您的超级班级有私人构造函数。它失败了。
private Singleton() {
System.out.println("I am user class");
}
子类Singleton
类是没有意义的。您可能需要重新考虑自己的设计。
首先,sudleton班级正在打破Singleton Pattern.
的基础知识其次,由于通过继承树调用构造函数的链,您会得到例外,因为父类的构造函数为 private
。
您可能会添加一个带有一些参数的公共构造函数,以使孩子从父母那里继承。然后,您可能会有许多SubClass
实例。任何Subclass
实例 is-a Singleton
实例。这是针对单例模式的目的。这就是为什么您应该避免将单人班级分类。