使用私有构造函数扩展类

时间:2010-10-17 10:21:33

标签: 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()是私有的 - 我们收到错误。 一个很好的例子和摆脱这种情况的方法是多少?

3 个答案:

答案 0 :(得分:43)

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

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

如果class只包含private个构造函数,您还可以将class更改为final,因为它根本无法扩展。


另一个解决方案是在test中创建一个方法,创建test的实例,并将每个方法调用从One委托给test实例。这样您就不必扩展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();
    }
}

答案 1 :(得分:1)

test非_ private的构造函数或One移至test

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

  • 类应命名为标题大小写(Test而不是test
  • 我建议创建One的构造函数private,除非从同一个包中的其他类调用它

答案 2 :(得分:0)

实际上,我发现有一条出路。像这样:

class Base {
    private Base() {

    }

    public void fn() {
        System.out.println("Base");
    }

    public static class Child extends Base {
        public void fn() {
            System.out.println("Child");
        }
    }

    public static Base getChild() {
        return new Child();
    }
}

现在,您可以使用getChild()来获取扩展类的实例。