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

RAY*_*RAY 7 java inheritance constructor subclass

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

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

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

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

谢谢

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

Ste*_*n C 3

如果出于实用原因无法使用工厂方法,我能想到的最佳解决方案是protected final在根类中创建一个进行后处理的方法,并向每个叶类添加对该方法的调用;例如

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();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果Intermediate不是,abstract那么您需要一个单独的公共构造函数来创建finishInit()在最后调用的实例。


这一切都有点笨拙,但如果您不能/不会重构代码以使用工厂方法,这就是您必须付出的代价。