确保在某些类型的所有声明和继承成员上调用方法

时间:2012-02-16 10:48:18

标签: java inheritance abstract-class composition

我想为标题道歉,但我不知道如何总结这个问题。


我有以下一个名为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则不知道}。

我现在正在寻找解决此问题的一般方法。以下是我分别考虑过的一些方法:

  • 尝试使用Reflection查找AbstractWriter类型的所有成员。但getDeclardFields错过了继承的getFields private
  • 制作isChangePerformed() abstract,以便每个实施都必须确保其实施正确。
  • 创建abstract方法getAbstractWriters,返回此类型中使用的所有AbstractWriter

您有什么想法来解决这个问题?

2 个答案:

答案 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;
    }
}