我想为一组类定义一些常见的构造后行为。当您在不同的类中共享行为时,Java会告诉我们将它们提取到父类中。
从概念上讲,我们说,对于这种类型的对象(及其子类),在构造之后进行一些后处理是有道理的;
实际上,这很难做到。您显然不能将它放在父类构造函数中,因为父构造函数在子类构造函数之前被称为。我可以在父类中编写一个postInit()方法,并要求所有子类将它作为构造函数中的最后一个语句来调用,但它看起来不是很干净,因为没有办法强制执行它,人们会忘记。 / p>
是否有一些我不知道的语言结构可以解决我的问题? 由于 关于要求的更多背景知识。下面的许多答案(我已经投票)提出的工厂方法等都是好主意,但我并没有那么奢侈。实际情况是这样的,我有这个父类,它由几十个子类扩展,这些子类又在许多其他地方使用。因此,重新设计如何使用这些子类是不可能的,并且更改所有子类是可能的边界。理想情况下,我只需要更改父类,这就是我要问的内容。
答案 0 :(得分:3)
如果由于实际原因不能使用工厂方法,我能想到的最佳解决方案是在根类中创建一个protected final
方法来进行后期处理,并添加对方法的调用每个叶子类; e.g。
public abstract class Root {
...
protected final void finishInit() {
// Do post-processing
}
}
public abstract class Intermediate {
...
protected Intermediate(...) {
super(...);
...
// don't call finishInit();
}
...
}
public class Leaf {
...
public Leaf(...) {
super(...);
...
finishInit();
}
...
}
如果Intermediate
不是abstract
,那么您需要一个单独的公共构造函数来创建最后调用finishInit()
的实例。
这有点笨拙,但如果您不能/不会重构您的代码以使用工厂方法,则必须支付罚金。
答案 1 :(得分:2)
一个解决方案是没有任何公共ctor。您可以使用工厂方法完成初始化,然后再将对象返回给调用者。
答案 2 :(得分:2)
嗯 - 最简单的解决方案是在IDE中为这个类层次结构添加模板。
您是否考虑过您的设计以及如何更改? 您可能需要某种设计模式,如Factory Method,Abstract Factory,Builder?