我毫不怀疑这个问题已经在这里被问过并回答过十几次了,但我就是找不到满意的答案。
我有一个类系列,我只想通过这样的静态方法由抽象父类实例化(我在这里可能有拼写错误,我正在输入但没有尝试编译)。
public abstract class Papa {
public static Papa newInstance() {
String strClass = Papa.figureOutTheNameOfChildClassToInstantiate();
Papa papa = (Papa) Class.forName(strClass).newInstance();
return papa;
}
public abstract void doSomething();
...
}
public class Child extends Papa {
public void doSomething() { /* Do something */ }
}
这或多或少就是我现在所拥有的。我想要做的是确保 Child 只能通过工厂方法 Papa.newInstance() 实例化。我尝试通过将 Child 的无参构造函数设为私有来实现此目的,但 Papa 无法实例化它。
所以,我的问题是,如何确保 Child 实例仅由工厂方法 Papa.newInstance() 创建?
如果你绝对、积极地想要强制执行这一点,那么就给Papa
一个受保护的构造函数,它接受一个类型的参数Xyzzy
. Make Xyzzy
受保护的内部类Papa
。给它一个私有构造函数。现在只Papa
可以举例Xyzzy
。因为您需要一个实例Xyzzy
打电话Papa
的构造函数,并且由于 的子类Papa
必须从其构造函数调用其构造函数,您需要一个实例Xyzzy
调用任何子类的构造函数Papa
。因此,只有Papa
可以调用其子类的构造函数。虽然Xyzzy
没有做任何事情。
子类可能会泄漏它们的Xyzzy
实例,这将允许其他代码调用子类构造函数。但你也可以通过使Xyzzy
一次性使用,并且仅在单个静态工厂调用的上下文中如此。
但说实话,我不会打扰!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)