使用VetoableChangeListener停止循环通知

时间:2008-09-23 09:42:52

标签: java model-view-controller

我对VetoableChangeListener的设计有疑问。我实现VetoableChangeListener接口来监听模型类中属性的更改,因此当模型触发时

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

...我尝试将更改保存在数据库中,这可能会失败(例如,SQLException)。如果失败,我会抛出PropertyVetoException以恢复模型中的更改。

模型在VetoableChangeSupport(JDK类)中委托,当它收到PropertyVetoException时会捕获它,并通过{{1}通知恢复到VetoableChangeListener全部} / oldValue互换(稍后重新抛出异常),以便事件再次出现在我的班级,我再次尝试保存在DB中等等......

我有一个解决方法,即在没有人抛出newValue之前模型不会改变,所以在PropertyVetoException我首先检查我要保存在数据库中的数据是否是不等于模型中的数据,如果它相等,我只是忽略变化。

还有其他更好的解决方法吗?

3 个答案:

答案 0 :(得分:1)

你的“解决方法”并不是真正的解决方法,但实际上听起来像是对我的正确解决方案:确认在尝试“更改”持久版本之前,对象的当前状态实际上已发生了变化。这也会更有效(数据库访问很昂贵)。

答案 1 :(得分:0)

您应该在更改模型之前检查Vetoable更改,而不是在...之后检查

即:如果出现问题,模型不会更改,如果更改错误则不会还原模型

答案 2 :(得分:0)

要:timyates

这正是我做的事情,我回忆起事件,尝试更新数据库,但它失败了,我抛出异常否决了更改,因此模型没有更新,但问题是VetoableChangeSupport通知我如果我不做我在问题中解释的解决方法

,那就拥有自己的否决权