繁体   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