如何扩展单例类

Amr*_*uta 2 java inheritance singleton class

如何扩展单例类?我收到错误:隐式超级构造函数 Demo() 不可见。必须显式调用另一个构造函数。

package demo;

public class Demo {

 private static Demo instance;

 private Demo(){}

 public static Demo getInstance(){
    if(instance ==null){
        instance=new Demo();
    }
    return instance;
 }
}
Run Code Online (Sandbox Code Playgroud)

Cup*_*Tae 5

严格来说它不是单例,但默认情况下,当您扩展一个类时,Java 会在构造子类时调用父类的无参数构造函数。通常为了阻止人们创建单例类的随机实例,单例的无参数构造函数将被设为私有,例如

private Demo() {...}
Run Code Online (Sandbox Code Playgroud)

如果您的 Demo 类没有子类可见的无参数构造函数,则需要告诉 Java 要调用哪个超类构造函数。例如,如果你有

protected Demo(String param) {...}
Run Code Online (Sandbox Code Playgroud)

那么你可能会这样做

protected SubDemo() {
    super("something");
...
}
Run Code Online (Sandbox Code Playgroud)

和/或

SubDemo(String param) {...}
{
    super(param);
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的 Demo 类没有非私有构造函数,您将无法有效地扩展它,并且(如果可能)您需要将 Demo 类中至少一个构造函数的保护级别更改为您的子类可以访问,例如 protected