Question

Je vais essayer d’expliquer mon problème aussi clairement que possible :). J'utilise PropertyChangeSupport pour notifier les vues enregistrées des modifications apportées aux propriétés. L'une de ces propriétés est un objet dont les propriétés sont modifiées toutes les secondes de la vue. Je ne veux pas créer pour cet objet particulier une nouvelle instance chaque fois qu'elle est mise à jour (pour que propertychangelistener remarque le changement), j'ai donc écrit ma propre méthode equals dans laquelle j'omets la comparaison à elle-même.

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

Malheureusement, cela n’a pas l’effet que je recherchais. Si je crée une copie de l'objet et déclenche la méthode de changement de propriété dessus, cela fonctionne correctement.

Qu'est-ce qui me manque ici?

- Modifier

Je me suis rendu compte que, puisque j'utilise la même instance et non une copie de celle-ci, les propriétés sont localisées au même endroit. La comparaison sera donc toujours vraie. Y at-il une solution de contournement à cela (en plus de créer une copie). Ou comment créer une copie d’un objet toutes les secondes, par exemple.

Était-ce utile?

La solution

Vous devez toujours renvoyer true pour indiquer à PropertyChangeSupport que votre objet n'a pas changé . Mais cela signifie que equals () est cassé pour tous les objets de cette classe (vous ne pouvez donc plus les utiliser dans des ensembles ou des cartes, par exemple).

Une meilleure solution serait d’avoir une méthode spéciale firePropertyChange () pour ce type d’objet qui effectue le traitement spécial. De cette façon, vous pouvez même éviter de créer une instance de PropertyChangeEvent également. Voici un exemple de traitement de BigDecimal (où equals () ne fonctionne pas du tout):

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

[EDIT] Ce que vous faites est tout à fait autre chose: vous avez un parent et un enfant et vous voulez que les auditeurs du parent reçoivent les événements lorsque l'enfant change.

La bonne approche consiste à ajouter PropertyChangeSupport à enfant . Lorsque l'enfant est ajouté au parent, ce dernier doit installer les écouteurs nécessaires dans l'enfant. Lorsqu'un événement est déclenché, il doit déclencher un deuxième événement qui informe les écouteurs du parent de la modification de l'enfant (le parent doit transférer les événements).

Autres conseils

il s’agit d’un cas d’encodeurs de propriété chaînés:

TransferQueueItem doit lancer ses propres PropertychangeEvents qui doivent être écoutés par la TransferQueue dans laquelle est insérée

Et en réponse, TransferQueue doit notifier à leurs écouteurs qu'un élément en propriété a été modifié.

Chaque fois que j'ai un problème comme celui-ci dans lequel un objet doit relancer des événements, j'utilise cette convention (de mon équipe de travail):

1 Un objet ne peut lancer que des événements dont la source est elle-même.

2 S'il souhaite un événement délégué, il lance un événement comme celui-ci: new PropertyChangeEvent (this, "DELEGATED_EVENT", null, createdEvent). Pour que les auditeurs puissent suivre la chaîne des événements.

En plus, j'ai une méthode statique dans une classe Util qui suit la chaîne d'événements et retourne le tout premier événement, la propriété one whick n'est pas "DELEGATED_EVENT"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top