单一实例设计模式及其子类的默认构造函数



在我的编码中,我将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实例时,它会自动调用其SuperClassconstructor以初始化其字段,并进一步调用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实例。这是针对单例模式的目的。这就是为什么您应该避免将单人班级分类。

相关内容

  • 没有找到相关文章

最新更新