毫无疑问,这已被问及在这里回答了十几次,但我无法找到满意的答案。只允许父厂方法实例化子类
我有一个类的家庭,我只想通过像这样的静态方法(我可能在这里输入错别字,而不尝试编译)输入的抽象父类实例化。
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无法实例化它。
所以,我的问题是,我如何确保子实例只能通过工厂方法Papa.newInstance()创建?
在内部类使用私有的构造是不是一个好主意 - 这迫使Java编译器生成存根构造带更多的知名度所以外部类可以实例化它们... – thkala
实际上,如果不是因为直到现在我已经直接在我的项目中实例化Child(和它的兄弟姐妹),现在我不会打扰它想要识别并删除所有这些直接实例,并强迫自己始终使用未来的工厂方法。但即使如此,我仍然可以没有所有的大惊小怪... –
对于这样的事情,类似Checkstyle的东西可能是谨慎的选择。有一天,我们将拥有一种语言,它具有足够强大的类型/访问系统来执行您想要做的事情,但在Java中这样做似乎可能会导致Lovecraftian。 –