用私有构造函数扩展类
假设我们有以下代码:
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(); } }
当我们创build一个对象One
,它最初被称为父类构造函数Test()
。 但作为Test()
是私人的 – 我们得到一个错误。 多less是一个很好的例子和出路这种情况?
没有出路。 你必须创build一个可用的( protected
, public
或默认)超级构造函数来扩展test
。
这种表示法通常用于实用程序类或单例中,您不希望用户通过扩展和实例化子类来创build自己的类的实例,或者只需调用类的构造函数即可。
当你有一个只有private
构造函数的class
时,你也可以把class
改成final
因为它根本不能被扩展。
另一种解决scheme是在test
中创build一个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(); } }
使test
的构造非private
或移动test
。
顺便说一句,你的示例代码包含几个问题:
- 类应该被命名为标题情况(
Test
而不是test
) - 我build议让这个
One
的构造函数是private
除非它是从同一个包中的不同类调用的
其实我find了一条出路 喜欢这个:
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()来获取扩展类的实例。