0

我会尽量清楚地解释我的问题:)。我正在使用 PropertyChangeSupport 通知已注册视图的属性更改。其中一个属性是一个对象,该对象的属性在每个视图秒内都会更改。我不想在每次更新时为这个特定对象创建新实例(让 propertychangelistener 注意到更改),所以我编写了自己的 equals 方法,在其中省略了与自身的比较。

@Override
public boolean equals(Object item) {
    // do not compare 
    // if (this == item) { return true; }

    if (!(item instanceof TransferQueueItem) || 
        item == null) {

        return false;
    }

    TransferQueueItem newItem = (TransferQueueItem) item;
    boolean value = 
            // ommited... properties comparation
    return value;
}

不幸的是,这并没有达到我想要的效果。如果我创建对象的副本并在其上触发属性更改方法,那么它可以正常工作。

我在这里想念什么?

- 编辑

我意识到,因为我使用的是同一个实例而不是它的副本,所以属性指向同一个地方,因此比较总是正确的。是否有解决方法(除了创建副本)。或者每秒创建一个对象的副本有多糟糕,例如。

4

2 回答 2

1

这是链式 propertychangelisteners 的一个例子:

TransferQueueItem 应该启动他们自己的 PropertychangeEvents 必须由插入的 TransferQueue 监听

作为响应,TransferQueue 必须通知其侦听器拥有的项目已更改。

每次我遇到这样的问题时,对象必须重新启动事件,我都会使用这个约定(我的工作团队的):

1 对象只能启动源为自身的事件。

2 如果它想要委托事件,它会启动这样的事件:new PropertyChangeEvent(this,"DELEGATED_EVENT", null, receivedEvent)。这样听众就可以跟踪事件链。

另外,我在 Util 类中有一个静态方法,它遵循事件链并返回第一个事件,其中一个属性不是“DELEGATED_EVENT”

于 2009-10-22T10:03:13.223 回答
1

你必须总是回来true告诉PropertyChangeSupport你你的对象没有改变。但这意味着equals()该类的所有对象都被破坏了(例如,您不能再在集合或地图中使用它们)。

更好的方法是firePropertyChange()为这种对象提供一种特殊的方法来进行特殊处理。这样,您甚至可以避免创建 的实例PropertyChangeEvent。这是一个处理示例BigDecimalequals()根本不起作用):

protected transient PropertyChangeSupport changeSupport = null;

public void addPropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    if (changeSupport == null)
        changeSupport = new PropertyChangeSupport (this);

    changeSupport.addPropertyChangeListener (propertyName, listener);
}

public void firePropertyChange (String propertyName, BigDecimal oldValue, BigDecimal newValue)
{
    if (changeSupport == null)
        return;

    if (oldValue != null && newValue != null && oldValue.compareTo (newValue) == 0) {
        return;
    }
    changeSupport.firePropertyChange(new PropertyChangeEvent(this, propertyName,
                                               oldValue, newValue));
}

[编辑] 你所做的完全是另一回事:你有一个父母和一个孩子,你希望父母的听众孩子改变时接收事件。

这里正确的做法是添加PropertyChangeSupportchild。将子级添加到父级时,父级必须在子级中安装必要的侦听器。当一个事件被触发时,它必须触发第二个事件,通知父级的侦听器的更改(父级必须转发事件)。

于 2009-10-22T08:38:01.643 回答