如何扩展一个单例类

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

public class Demo {

 private static Demo instance;

 private Demo(){}

 public static Demo getInstance(){
    if(instance ==null){
        instance=new Demo();
    }
    return instance;
 }
}

Java?什么是编程语言? - Abdennour TOUMI
除了@AbdennourToumi的评论之外,请在您的Demo()类中发布代码和您尝试扩展的原始单例,以帮助我们进行故障排除。似乎您在原始单例类中有一个私有构造函数。 - Gary Schreiner
错误信息指出了 Java,但我同意上面的评论 - 你应该在问题中添加更多细节,并且如果正确的话,请加上 Java 标签。 - CupawnTae
我认为Singleton类的行为不是特定于语言的,所以我没有为Java添加标记。 - Bosco
可能是在Java中实现单例模式的有效方法是什么?的重复问题。 - fredoverflow
1个回答

8

这与其是一个单例模式的严格规定无关,而是因为在Java中,当你扩展一个类时,默认情况下会调用父类的无参构造函数来构造子类。通常为了防止创建单例类的随意实例,单例类的无参构造函数会被设置为私有的,例如:

private Demo() {...}

如果您的Demo类没有可在子类中看到的无参数构造函数,您需要告诉Java调用哪个超类构造函数。例如,如果您有:
protected Demo(String param) {...}

那么您可能需要执行的操作是:
protected SubDemo() {
    super("something");
...
}

和/或

SubDemo(String param) {...}
{
    super(param);
}

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

“protected” 是我正在寻找的。 - Johnny Five

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接