使用私有构造函数扩展类

2022-08-31 17:39:31

假设我们有以下代码:

class Test {
    private Test() {
        System.out.println("test");
    }

}

public class One extends Test {

    One() {
        System.out.println("One");
    }

    public static void main(String args[]) {

        new One();
    }
}

当我们创建一个对象时,它最初被称为父类构造函数。但作为私人 - 我们得到一个错误。一个好的例子和摆脱这种情况的方法是多少?OneTest()Test()


答案 1

没有出路。您必须创建一个可用的(或默认的)超级构造函数才能扩展 。protectedpublictest

这种表示法通常用于实用程序类或单例中,在这些类或单例中,您不希望用户通过扩展它并实例化子类,或者只是通过调用类的构造函数来创建类的实例。

当您有 一个只有构造函数时,您也可以将 更改为,因为它根本无法扩展。classprivateclassfinal


另一种解决方案是使用一种方法,在该方法中创建实例并将每个方法调用委托给实例。这样,您就不必扩展 .testtestOnetesttest

class Test {
    private Test() {
        System.out.println("test");
    }
    public static Test getInstance(){
        return new Test();
    }
    public void methodA(){
        //Some kind of implementation
    }
}

public class One {
    private final Test test;
    One() {
        System.out.println("One");
        test = Test.getInstance();
    }

    public void methodA(){
        test.methodA();
    }

    public static void main(String args[]) {
        new One();
    }
}

答案 2

使 non- 的构造函数移入 。testprivateOnetest

顺便说一句,您的示例代码包含一些问题:

  • 类应命名为标题大小写 ( 而不是Testtest)
  • 我建议制作 's 构造函数,除非它是从同一包中的不同类调用的Oneprivate