public class MyContainer { // implements property change support private PropertyChangeSupport changeSupport = ...; // this is the observable object private MyData data; public void addPropertyChangeListener(PropertyChangeListener l) {...} public void removePropertyChangeListener(PropertyChangeListener l) {...} public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {...} public MyData getData() {...} public MyData setData(MyData newValue) { // create oldValue from member MyData oldValue = data.clone(); // Mutate member instead of replacing the reference data.setAttributes(newValue); // fire change and provide correct old and new value firePropertyChange("data", oldValue, data); } }
private void notifyIfChanged(ValueDiff<? extends T> diff) { if (hasListeners()) { // here diff.getOldValue() is not considered T oldValue = cachedValue; // here diff.getNewValue() is not considered T newValue = cachedValue = property.getValue(source); if (diff == null) diff = Diffs.createValueDiff(oldValue, newValue); if (!Util.equals(oldValue, newValue) || stale) { stale = false; // here diff is transmitted untouched in case it is not null fireValueChange(Diffs.unmodifiableDiff(diff)); } } }