2010-10-17 97 views
39

假设我们有下面的代码:类的私人构造延伸

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

回答

39

没有出路。您必须创建一个可用的(protected,public或默认)超级构造函数,以便能够扩展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(); 
    } 
} 
+4

Test类的getInstance()方法应该是静态的。否则,不可能像“Test.getInstance()”那样进行调用。 – vanje 2010-10-17 11:37:12

+0

@vanje,谢谢,更新 – 2010-10-17 11:37:58

1

使testprivate构造或移动Onetest

顺便说一句,你的示例代码中包含的几个问题:

  • 类应该被命名为标题的情况下(的Test代替test
  • 我建议让One的构造private,除非它是在同一个包裹中从不同类别呼叫
+0

如果你没有测试的源代码? – powder366 2017-01-13 14:33:23

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()获取扩展类的实例。

+5

这只适用于放置静态内部类时,因为内部类可以访问私有方法。不幸的是,这并没有帮助,因为如果你能够改变这个类,你可以通过将构造函数设置为受保护或公共位置来更好地服务。 – 2015-02-23 18:07:06