java - 使用私有(private)构造函数扩展类

标签 java constructor

假设我们有以下代码:

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();
    }
}

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

最佳答案

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

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

当你有一个只有 private 构造函数的 class 时,你也可以将 class 更改为 final 因为根本无法扩展。


另一种解决方案是在 test 中创建一个方法,该方法创建 test 的实例并将每个方法调用从 One 委托(delegate)给 测试 实例。这样您就不必扩展 test

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();
    }
}

关于java - 使用私有(private)构造函数扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3952815/

相关文章:

java - java中锁定文件

javascript - DevTools 如何确定对象的构造函数名称?

c++ - Scott Meyers 关于偏好非成员非友元方法的建议是否适用于对象构造?

java - Spring Data JPA 实体的有效标志

c# - 如何使泛型类成为另一个实例类中的属性?

c++ - 为什么内联在这里不起作用?

c++ - 为什么这个构造函数重载解析不正确?

java - "adapter"放在 MVP(被动 View )中的什么位置?

java - 用于单元测试的 Mock dao

java - 如何在没有 spring 数据的情况下使用 spring 页面