簡體   English   中英

添加元素時屬性更改事件對集合的舊值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM