我想为标题道歉,但我不知道如何总结这个问题。
我有以下名为 AbstractWriter
的类:
public class AbstractWriter {
private boolean changePerformed = false;
// Some Setters
private void changePerformed() {
if (!changePerformed)
changePerformed = true;
}
public boolean isChangePerformed() {
return changePerformed;
}
protected <S> void setValue(
Class<S> type, Object oldValue, Object newValue, Setter setter) {
// Do something
changePerformed();
}
}
每当调用 setter 时,方法 setValue(…)
都会被调用。所有 setter 都执行此规则。
然后是 AgeWriter
,从 AbstractWriter
扩展而来:
public class AgeWriter extends AbstractWriter {
// Some Setters
}
还有 HumanWriter
:
public class HumanWriter {
// Some setter calls are delegated to this Writer
private AgeWriter ageWriter = new AgeWriter();
// Some Setters
}
当我现在调用 HumanWriter
上的方法 isChangePerformed()
时,我只知道是否调用了 HumanWriter
上的 setter,但不知道如果其中一个委托(delegate) setter 到 AgeWriter
。
我现在正在寻找解决此问题的通用方法。以下是我尝试过的分别想到的一些方法:
- 尝试使用反射查找类型为
AbstractWriter
的所有成员。但是getDeclardFields
错过了继承的那些,而getFields
错过了private
的。 - 使
isChangePerformed()
抽象
,以便每个实现都必须确保其实现正确。 - 创建
abstract
方法getAbstractWriters
返回此类型中使用的所有AbstractWriter
。
您有什么想法可以解决这个问题?
最佳答案
如果您将 ageWriter
保持为 HumanWriter
私有(private),则任何外部对象都无法直接调用 AgeWriter
上的 setter。使用封装,不向 ageWriter 提供任何访问器,并在 HumanWriter
上使用委托(delegate)给 ageWriter
的方法。
您还可以使用可观察/观察者模式(JavaBeans 属性更改监听器)并将 HumanWriter 作为监听器添加到 AgeWriter。这样,ageWriter 上的每个属性更改都会触发一个事件,该事件将发送到 HumanWriter。
关于java - 确保对某种类型的所有已声明和继承的成员调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9309927/