我想为标题道歉,但我不知道如何总结这个问题。
我有以下一个名为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
}
当我现在调用isChangePerformed()
上的方法HumanWriter
时,我只知道是否已调用HumanWriter
上的setter,但是如果其中一个将setter委托给AgeWriter
则不知道}。
我现在正在寻找解决此问题的一般方法。以下是我分别考虑过的一些方法:
AbstractWriter
类型的所有成员。但getDeclardFields
错过了继承的getFields
private
。isChangePerformed()
abstract
,以便每个实施都必须确保其实施正确。abstract
方法getAbstractWriters
,返回此类型中使用的所有AbstractWriter
。您有什么想法来解决这个问题?
答案 0 :(得分:0)
如果您将ageWriter
保密至HumanWriter
,则任何外部对象都无法直接调用AgeWriter
上的设置者。通过不向ageWriter提供任何访问者来使用封装,并使用委托给HumanWriter
的{{1}}上的方法。
您还可以使用可观察/观察者模式(JavaBeans属性更改侦听器)并将HumanWriter添加为AgeWriter的侦听器。这样,ageWriter上的每个属性更改都会触发一个将发送给HumanWriter的事件。
答案 1 :(得分:0)
我的想法可能很愚蠢。但我认为它应该工作:)。你可以使用作家列表......
public abstract class AbstractWriter {
private List<AbstractWriter> writers;
//...
private boolean changePerformed = false;
//...
public boolean isChangePerformed() {
for (AbstractWriter writer : writers) {
if(writer.isChangePerformed() && changePerformed) {
return true;
}
}
return false;
}
}