如何检测对象中的修改?

时间:2016-06-24 10:24:50

标签: java

假设我有一个项目集合,例如List<Item>,我需要检查是否从包装类中修改了任何项目,例如,任何项目的属性值都已更改通过二传手:

List<Item> items = itemsWrapper.getItems(); // itemsWrapper contains a list of items
Item anItem = items.get(index);
item.setProperty(property);
itemsWrapper.hasChanged(); // ??????

我试图想出一种方法来实现最后一种陈述,或类似的东西。

我可以看到有类似的问题,例如this one建议使用Hibernate但答案非常模糊,我的问题与数据库无关。它还提到建立一个听众列表,但我不确定他是如何做到的。

this other question,其中所选答案建议使用每次修改属性时需要上升的dirty标记。但是,我的课实际上会变得更脏,矛盾的是,我需要修改许多修改项目属性的方法。

还有另一种方法,如果它是透明的,那就最好吗?

4 个答案:

答案 0 :(得分:0)

简单地说,让对象私有广告为其创建getter和setter。这样,当包装器更改列表中的任何内容时,您就可以获得。

如果要检测,当一个新元素放入列表时,您可以创建第三个加法器方法来向元素添加元素。

答案 1 :(得分:0)

最好的方法是使用java.util.Observable具有函数boolean hasChanged()的类,如您的用例所示。 这是一个参考答案: When should we use Observer and Observable

只是一个例子:

<code>import java.util.Observable;
import java.util.Observer;
// First observer 
class FirstNewsReader implements Observer {
    public void update(Observable obj, Object arg) {
        System.out.println("FirstNewsReader got The news:"+(String)arg);
    }
}
//Second Observer
class SecondNewsReader implements Observer {
    public void update(Observable obj, Object arg) {
        System.out.println("SecondNewsReader got The news:"+(String)arg);
    }
}
// This is the class being observed.
class News extends Observable {
    void news() {
        String[] news = {"News 1", "News 2", "News 3"};
        for(String s: news){
            //set change
            setChanged();
            //notify observers for change
            notifyObservers(s);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("Error Occurred.");
            }
        }
    }
}
//Run Observer and Observable
class ObserverObservableDemo {
    public static void main(String args[]) {
        News observedNews = new News();
        FirstNewsReader reader1 = new FirstNewsReader();
        SecondNewsReader reader2 = new SecondNewsReader();
        observedNews.addObserver(reader1);
        observedNews.addObserver(reader2);
        observedNews.news();        
    }
}</code>

答案 2 :(得分:0)

使用Item /包装类的观察者模式。 JavaFX(自java 7.something以来包含)属性已经支持为这样的功能提供支持。

示例:

class Item {

    private final ObjectProperty<Object> property = new SimpleObjectProperty<Object>();

    public final Object getProperty() {
        return this.property.get();
    }

    public final void setProperty(Object value) {
        this.property.set(value);
    }

    public final ObjectProperty<Object> propertyProperty() {
        return this.property;
    }
}
class Listener implements InvalidationListener {

    private boolean changed = false;

    @Override
    public void invalidated(Observable observable) {
        changed = true;
    }

    public boolean isChanged() {
        return changed;
    }

    public void resetChanged() {
        this.changed = false;
    }

}
// trigger update changes when the property changes
ObservableList<Item> list = FXCollections.observableArrayList(e -> new Observable[]{e.propertyProperty()});

list.addAll(new Item(), new Item());

Listener listener = new Listener();
list.addListener(listener);
System.out.println(listener.isChanged());

list.get(0).setProperty("");
System.out.println(listener.isChanged());
listener.resetChanged();

list.get(1).setProperty(1);
System.out.println(listener.isChanged());

listener.resetChanged();

list.add(new Item());
System.out.println(listener.isChanged());

答案 3 :(得分:0)

最透明的方式是使用Spring AOP AspectJ。创建Aspect类并使用@Before或@after注释作为item.setProperty()方法。

相关问题