Java:子类构造函数完成后的后处理

时间:2011-05-05 03:12:42

标签: java inheritance constructor subclass

我想为一组类定义一些常见的构造后行为。当您在不同的类中共享行为时,Java会告诉我们将它们提取到父类中。

从概念上讲,我们说,对于这种类型的对象(及其子类),在构造之后进行一些后处理是有道理的;

实际上,这很难做到。您显然不能将它放在父类构造函数中,因为父构造函数在子类构造函数之前被称为。我可以在父类中编写一个postInit()方法,并要求所有子类将它作为构造函数中的最后一个语句来调用,但它看起来不是很干净,因为没有办法强制执行它,人们会忘记。 / p>

是否有一些我不知道的语言结构可以解决我的问题?

由于

关于要求的更多背景知识。下面的许多答案(我已经投票)提出的工厂方法等都是好主意,但我并没有那么奢侈。实际情况是这样的,我有这个父类,它由几十个子类扩展,这些子类又在许多其他地方使用。因此,重新设计如何使用这些子类是不可能的,并且更改所有子类是可能的边界。理想情况下,我只需要更改父类,这就是我要问的内容。

3 个答案:

答案 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?