PropertyChangeSupport и метод equals - PullRequest
       22

PropertyChangeSupport и метод equals

0 голосов
/ 22 октября 2009

Я постараюсь объяснить мою проблему как можно яснее :). Я использую 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;
}

К сожалению, это не имеет эффекта, который я искал. Если я создаю копию объекта и запускаю метод изменения свойства, он работает нормально.

Что мне здесь не хватает?

- Правка

Я понял, что, поскольку я использую один и тот же экземпляр, а не его копию, свойства указывают на одно и то же место, поэтому сравнение всегда получится. Есть ли обходной путь к этому (помимо создания копии). Или как плохо создавать копию объекта каждую секунду, например.

Ответы [ 2 ]

1 голос
/ 22 октября 2009

это случай цепочки свойств заменяющих веществ:

TransferQueueItem должен запустить свои собственные PropertychangeEvents, которые должны прослушиваться TransferQueue, в который вставлено

И в ответ TransferQueue должен уведомить своих слушателей, что принадлежащий объект изменился.

Каждый раз, когда у меня возникает такая проблема, когда объект должен перезапускать события, я использую это соглашение (моей рабочей команды):

1 Объект может запускать только события, источником которых является сам.

2 Если он хочет делегировать событие, он запускает событие, подобное этому: new PropertyChangeEvent (this, "DELEGATED_EVENT", null, receiveEvent) Чтобы слушатели могли следить за цепочкой событий.

У меня есть статический метод в классе Util, который следует за цепочкой событий и возвращает самое первое событие, одно свойство whick не равно "DELEGATED_EVENT"

1 голос
/ 22 октября 2009

Вы всегда должны возвращать true, чтобы сообщить PropertyChangeSupport, что ваш объект не изменился. Но это означает, что equals() не работает для всех объектов этого класса (например, вы больше не можете использовать их в наборах или картах).

Лучше было бы иметь специальный метод firePropertyChange() для такого типа объектов, который выполняет специальную обработку. Таким образом, вы даже можете избежать создания экземпляра PropertyChangeEvent. Вот пример для обработки BigDecimal (где equals() вообще не работает):

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));
}

[РЕДАКТИРОВАТЬ] То, что вы делаете, это совсем другое: у вас есть родитель и ребенок, и вы хотите, чтобы слушатели parent получали события, когда child меняется.

Правильный подход здесь - добавить PropertyChangeSupport к child . Когда дочерний элемент добавляется к родительскому элементу, родительский компонент должен установить необходимые дочерние элементы в дочернем элементе. Когда событие вызывается, оно должно запустить второе событие, которое информирует слушателей parent об изменении child (родитель должен переслать события).

...