У меня проблема с дизайном VetoableChangeListener
. Я реализую интерфейс VetoableChangeListener
для прослушивания изменений свойства в классе модели, поэтому при срабатывании модели
vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
… Я пытаюсь сохранить изменения в БД, которые могут потерпеть неудачу (например, SQLException
). Если это не удается, я выбрасываю PropertyVetoException
, чтобы отменить изменения в модели.
Модель делегирует в VetoableChangeSupport
(класс JDK), который, когда получает PropertyVetoException
, ловит ее и уведомляет о возврате ко ВСЕМ VetoableChangeListener
, с oldValue
/ newValue
взаимозаменяемыми (позже он сбрасывает исключение), так что событие снова приходит в мой класс, и я снова пытаюсь сохранить в БД и т. д ...
У меня есть обходной путь, который заключается в том, что модель НЕ меняется, пока никто не выбросит PropertyVetoException
, так что в VetoableChangeListener
Я ПЕРВЫЙ проверю, не совпадают ли данные, которые я собираюсь сохранить в базе данных, с данные в модели, если они равны, я просто игнорирую изменение.
Есть ли другой, лучший обходной путь?