Frage

Ich werde versuchen, mein Problem so klar wie möglich :) zu erklären. Ich bin mit Property registrierte Ansichten für Änderungen in den Eigenschaften zu informieren. Einer der Eigenschaft ist ein Objekt, das Eigenschaften jeder Ansicht Sekunden geändert werden. Ich möchte nicht jedes Mal für diese besondere Aufgabe neue Instanz schaffen es (für die Property die Änderung zu bemerken) aktualisiert wird, so schrieb ich meine eigene Methode equals, wo ich die comparation sich ommit.

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

Unfortunatelly, die nicht dazu führt, dass ich suchte. Wenn ich eine Kopie des Objekts erstellen und die Eigenschaft Änderungsverfahren auf sie schießen, dann funktioniert es gut.

Was bin ich hier fehlt?

- Bearbeiten

Ich erkennen, dass ich da die gleiche Instanz verwenden und nicht eine Kopie davon, die Eigenschaften die gleiche Stelle sind pointig, so würde die comparation immer kommt wahr. Gibt es eine Abhilfe zu, dass (neben einer Kopie erstellen). Oder, wie schlecht ist jede Sekunde eine Kopie eines Objekts zu erstellen, z. B.

War es hilfreich?

Lösung

Sie müssen immer true zurückkehren PropertyChangeSupport zu sagen, dass Ihr Objekt tat nicht ändern. Das bedeutet aber, equals() für alle Objekte dieser Klasse gebrochen wird (so dass Sie sie nicht in Sätzen oder Karten verwenden können mehr, zum Beispiel).

Eine bessere Möglichkeit, eine spezielle Methode firePropertyChange() für diese Art von Objekt zu haben wäre, die die besondere Behandlung der Fall ist. Auf diese Weise können Sie auch vermeiden, eine Instanz von PropertyChangeEvent zu schaffen, auch. Hier ist ein Beispiel für den Umgang mit BigDecimal (wo equals() überhaupt nicht funktioniert):

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] Was Sie tun, ist etwas ganz anderes: Sie haben einen Elternteil und ein Kind, und Sie wollen Hörer der Eltern Ereignisse zu empfangen, wenn die Kind Änderungen.

Der hier richtige Ansatz ist PropertyChangeSupport auf das Kind hinzuzufügen. Wenn das Kind zum Vater hinzugefügt wird, müssen die Eltern die notwendigen Zuhörer in dem Kind installieren. Wenn ein Ereignis ausgelöst wird, muss es ein zweites Ereignis ausgelöst, das den Hörer des informiert Eltern der Änderung in dem Kind (die Eltern müssen die Ereignisse weiterleiten).

Andere Tipps

Dies ist ein Fall von verketteten propertychangelisteners:

TransferQueueItem sollten ihre eigenen Property starten, die von der TransferQueue in dem eingefügt angehört werden müssen

Und als Antwort TransferQueue müssen ihre Zuhörer informieren, dass ein im Besitz Element geändert hat.

Jedes Mal, wenn ich ein Problem wie dieses haben, in dem ein Objekt Ereignisse wiederzubeleben muss ich diese Konvention verwenden (meiner Arbeitsteam):

1 Ein Objekt kann nur Ereignisse starten, welche Quelle selbst ist.

2 Wenn es delegieren Veranstaltung wollen es launchs ein Ereignis wie folgt aus: neue Property (this, "DELEGATED_EVENT", null, receivedEvent). Damit die Zuhörer können die Kette von Ereignissen folgen.

Addicionally i eine statische Methode in einer Util Klasse haben, die die Ereignisse Kette und gibt die erste Veranstaltung folgen, die eine whick Eigenschaft nicht „DELEGATED_EVENT“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top