Java 单例设计模式及其子类&x27;s的默认构造函数
在我的编码中,我使用Java 单例设计模式及其子类&x27;s的默认构造函数,java,Java,在我的编码中,我使用Singleton类和Singleton设计模式。问题是为什么它的子类不允许使用默认构造函数 我得到编译时错误: Implicit super constructor Singleton() is not visible. Must explicitly invoke another constructor Singleton.java public class Singleton { private static Singleton singleton;
Singleton
类和Singleton设计模式
。问题是为什么它的子类不允许使用默认构造函数
我得到编译时错误:
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");
}
}
因为您的
Singleton
类no-arg构造函数是private
。当您实例化子类时,它也尝试实例化超类。但是你的超类有私有构造函数。它失败了
private Singleton() {
System.out.println("I am user class");
}
子类
Singleton
class是没有意义的。您可能需要重新考虑您的设计。因为您的单例类无参数构造函数是私有的。当您实例化子类时,它也尝试实例化超类。但是你的超类有私有构造函数。它失败了
private Singleton() {
System.out.println("I am user class");
}
子类Singleton
class是没有意义的。您可能需要重新考虑您的设计。单例类不应该被继承,因此下面确保
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类不应该被继承,所以下面可以确保
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
类没有意义,因为在这种情况下,您的类将不再是singleton
你应该重新思考你的设计和你想做的事情。并相应地更改您的设计。当您创建子类的实例时,它会自动调用其超类的构造函数来初始化其字段,并进一步调用继承层次结构中的所有超类构造函数
现在,因为您的超类
构造函数是私有的,所以它不能调用它。所以,你得到了这个例外
但是子类singleton
类没有意义,因为在这种情况下,您的类将不再是singleton
你应该重新思考你的设计和你想做的事情。然后相应地更改设计。首先,对单例类进行子类化打破了单例模式的基础。
其次,由于通过继承树调用构造函数的链条,您会得到该异常,因为父类的构造函数是private
您可能会添加一个带有一些参数的公共构造函数,以使子对象从其父对象继承。然后您可能会有许多子类的实例。任何子类
实例也是一个单例
实例。这与单例模式的目的背道而驰。这就是为什么你应该避免子类化一个单例类。首先,子类化一个单例类打破了单例模式的基础。
其次,由于通过继承树调用构造函数的链条,您会得到该异常,因为父类的构造函数是private
您可能会添加一个带有一些参数的公共构造函数,以使子对象从其父对象继承。然后您可能会有许多子类的实例。任何子类
实例也是一个单例
实例。这与单例模式的目的背道而驰。这就是为什么您应该避免将单例类子类化。如果将单例类子类化,它就不再是单例类。你做错了。你不能创建一个可编译的子类的原因是因为单例设计模式故意使子类无法创建。这就是只有私有构造函数所做的。如果你将一个单例类子类化,它就不再是单例类了。你做错了。你不能创建一个可编译的子类的原因是因为单例设计模式故意使子类无法创建。只有私有构造函数才能做到这一点。