Java对象,改变字段侦听器,设计模式 [英] Java object, changed fields listener, design-pattern

查看:185
本文介绍了Java对象,改变字段侦听器,设计模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个类:

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

然后我们更新一些字段



Then we update some fields

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

我如何知道MyClass的哪些字段被尝试更改(调用,在上面的示例中field1和field2)?

什么是最好的解决方案?也许是一些设计模式?

一个选项是为这个对象创建一个更改字段的 HashSet 作为附加属性,并在每个setter内更新它似乎不太好。

应该像Proxy对象那样拦截所有方法调用(即setXXX())(通过Java反射?)或其他任何东西?

How can I know which fields of MyClass were tried to be changed (invoked, in the example above field1 and field2)?
What is the best solution for that? Maybe some design-pattern?
One option is to create HashSet of changed fields for this object as an additional property and update it inside each setter but it does not seem nice.
Should it be something like Proxy object which will be intercept all method calls (i.e. setXXX()) (through Java reflection?) or anything else?

更新

似乎每个setter都应该调用一些内部方法,看起来好像我说的那样。而且我不需要通知任何其他对象有关更改。我想将所有状态存储在此对象中,稍后可以访问这些更改。

详细信息:如果方法setFieldX被调用,则fieldX应该被标记为稍后更新

P.S.所有字段都有不同的名称。

除了反射以外的任何其他解决方案(我想通过纯粹的setter填充对象)?

UPDATE
It seems that each setter should invoke some inner method what does not seem nice as I said. And I don't need to notify any other objects about changes. I would like to store all states in this object and have access to these changes later.
In details: if method setFieldX invoked then fieldX should be marked to be updated later
P.S. All fields have different names.
Any other solutions except reflection (I want to populate object via pure setter)?

推荐答案

如果要使用常规设计模式方法实施,我建议使用观察者模式

If you want to implement using conventional design-pattern approach, I would recommend using Observer Pattern

为您的课程设置字段事件设置侦听器

Have a Listener for set field event of your class

public interface FieldListener {

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

使一个类实现此监听器(Observer)

Make a class implement this listener (Observer)

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方法时,只需触发该事件。

have a place-holder for your listeners in the Observable class (in your case MyClass) and whenever the set method gets called, just fire the event.

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");
    }

}

这篇关于Java对象,改变字段侦听器,设计模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆