使用私有构造函数扩展类

use*_*011 46 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Col*_*ert 49

没有出路.你必须创建一个可用的(protected,public或默认)的超级构造函数能够延长test.

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

如果class只有private构造函数,则还可以更改classto,final因为它根本无法扩展.


另一种解决方案是使用一种方法,在test该方法中创建实例test并将每个方法调用委托Onetest实例.这样您就不必进行扩展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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 类`Test`的`getInstance()`方法应该是静态的.否则就不可能像`Test.getInstance()`那样进行调用. (5认同)