gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:56 25 4
gpt4 key购买 nike

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

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

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

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

谢谢

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

最佳答案

如果出于实用原因不能使用工厂方法,我能想到的最佳解决方案是创建一个 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();
}
...
}

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


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

关于Java:子类构造函数完成后的后处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5892229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com