假设我有一个项目集合,例如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
标记。但是,我的课实际上会变得更脏,矛盾的是,我需要修改许多修改项目属性的方法。
还有另一种方法,如果它是透明的,那就最好吗?
答案 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()方法。