[英]How to get old entity value in @HandleBeforeSave event to determine if a property is changed or not?
[英]Property change event's old value for collections when element is added
我有一個Java Bean,它具有帶有getter的collection屬性,並且還為該collection提供add方法。
因此,當使用add
方法修改集合時,我必須觸發PropertyChangeEvent
。 PropertyChangeEvent
具有一個舊值和一個新值。
您如何處理舊價值?
為了使事情變得容易,我將在這里使用String
的集合。 例如
public class MyBean {
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private Set<String> names = new HashSet();
// Delegate methods to add/remove PropertyChangeListeners are omitted here
/**
* The collection property
*/
public Collection<String> getNames() {
return Collections.unmodifiableCollection(names);
}
public void addName(String name){
if(names.add(name)){
Collection<String> oldValue = ????; // How do you get the old value
Collection<String> newValue = Collections.unmodifiableCollection(names);
pcs.firePropertyChange("names", oldValue, newValue);
}
}
}
獲取舊值的一種方法可能是在添加之前創建副本
public void addName(String name) {
Collection<String> oldValue = new HashSet<>(names);
if (names.add(name)) {
Collection<String> newValue = Collections.unmodifiableCollection(names);
pcs.firePropertyChange("names", oldValue, newValue);
}
}
但是在很多情況下,舊值可能一無所獲。
因此,另一個想法是不使用add方法,而是在之前使用contains
public void addName(String name) {
if (names.contains(name)) {
return;
}
Collection<String> oldValue = new HashSet<>(names);
names.add(name);
Collection<String> newValue = Collections.unmodifiableCollection(names);
pcs.firePropertyChange("names", oldValue, newValue);
}
這與Set
一起很好地工作。 但是,當names
集合是ArrayList
,它將不起作用,因為ArrayList
可以包含相等對象的多個實例。 因此, contains
將返回true,但add
也將返回true
。
在多線程環境中,先檢查包含然后添加,這可能也是一個問題,因為與此同時,另一個線程可能已經添加了相同的對象。 但是我不想在這里介紹這種復雜性。 我只想為單線程環境找到一個好的設計,通常是在UI(Event-Dispatch-Thread)中使用此類bean時。
在這種情況下,您如何處理舊值?
您可以使用Map.putIfAbsent
實現,並使鍵和值相同。
如果鍵存在,則將返回先前(舊)的值,並將其用於觸發firePropertyChange
。 在多線程環境中效果很好,只有一個線程能夠添加新條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.