6

有一个类:

public class MyClass {
private String field1;
private String field2;
private String field3;
// getters, setters
}

然后我们更新一些字段

MyClass myClass = new MyClass();
myClass.setField1("field1");
myClass.setField2(null);

我如何知道尝试更改 MyClass 的哪些字段(在上面的示例中调用 field1 和 field2)?
什么是最好的解决方案?也许一些设计模式?
一种选择是HashSet为此对象创建更改的字段作为附加属性,并在每个设置器中更新它,但它看起来并不好。
它应该是类似于 Proxy 对象的东西,它将拦截所有方法调用(即 setXXX())(通过 Java 反射?)或其他任何东西?

更新
似乎每个设置器都应该调用一些内部方法,正如我所说的那样,它看起来并不好。而且我不需要通知任何其他对象有关更改。我想将所有状态存储在这个对象中,以后可以访问这些更改。
详细说明:如果调用 setFieldX 方法,则应将 fieldX 标记为稍后更新
PS 所有字段具有不同的名称。
除了反射之外的任何其他解决方案(我想通过纯 setter 填充对象)?

4

4 回答 4

8

如果您想使用传统的设计模式方法来实现,我建议使用观察者模式

有一个侦听器用于您班级的设置字段事件

public interface FieldListener {

    public void fieldValueChanged(String fieldName, Object newValue);
}

让一个类实现这个监听器(观察者)

public class SampleObserver implements FieldListener {

    @Override
    public void fieldValueChanged(String fieldName, Object newValue) {
        System.out.println(fieldName + " - got set with value - " + newValue);
    }

}

在 Observable 类(在您的情况下)中为您的侦听器提供一个占位符,MyClass并且每当调用 set 方法时,只需触发该事件。

public class MyClass {

    List<FieldListener> listeners = new ArrayList<FieldListener>(); // the placeholder for listeners

    private String field1;
    private String field2;

    /**
     * @param field1 the field1 to set
     */
    public void setField1(String field1) {
        fireEvent("field1", field1);
        this.field1 = field1;
    }
    /**
     * @param field2 the field2 to set
     */
    public void setField2(String field2) {
        fireEvent("field2", field2);
        this.field2 = field2;
    }

    public void addListener(FieldListener l) {
        if(l != null) listeners.add(l);
    }

    public void fireEvent(String fieldName, Object newValue) {
        for(FieldListener l : listeners) {
            l.fieldValueChanged(fieldName, newValue);
        }
    }

    public static void main(String [] args) {
        MyClass m = new MyClass();
        m.addListener(new SampleObserver());
        m.setField1("s");
        m.setField2("v");
    }

}
于 2013-06-06T07:11:15.587 回答
5

我认为您正在搜索的java.bean.PropertyChangeListener是 Java 中的观察者模式。

基本上,您将代码添加到所有设置器以调用中的方法PropertyChangeListener以通知所有观察者该值已更改。

这是正常的Java方式。

于 2013-06-06T07:02:16.557 回答
2

听起来你想要Observer / Observable模式。基本上,状态侦听器向对象注册(观察)以myClass在发生变化时接收通知。

于 2013-06-06T07:00:12.457 回答
2

这很难说,因为我们不知道您为什么需要监视这些字段以及要对这些更改执行什么操作。

您可以做的一件事是向您的对象添加侦听器(观察者模式),以便对更改感兴趣的类可以收到有关它的通知。这当然只有在您可以访问感兴趣的类并且可以相应地修改它们时才有效。

如果您无权访问并且任何人都可以调用您的方法,那么您可能必须通过反射进行。如果您需要更好的答案,您必须提供更多详细信息。

更新

由于您只想通过设置器在内部跟踪它,那么您可以简单地放入您的设置器,无论您需要什么来跟踪更改。一种解决方案可能是创建一个单独的类来存储更改。因此,每当您进行一些更新时,您都会调用跟踪器类并告诉它您要跟踪的信息,例如旧值、新值、时间戳等。

于 2013-06-06T07:01:06.703 回答