我对VetoableChangeListener
的设计有疑问。我实现VetoableChangeListener
接口来监听模型类中属性的更改,因此当模型触发时
vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
...我尝试将更改保存在数据库中,这可能会失败(例如,SQLException
)。如果失败,我会抛出PropertyVetoException
以恢复模型中的更改。
模型在VetoableChangeSupport
(JDK类)中委托,当它收到PropertyVetoException
时会捕获它,并通过{{1}通知恢复到VetoableChangeListener
全部} / oldValue
互换(稍后重新抛出异常),以便事件再次出现在我的班级,我再次尝试保存在DB中等等......
我有一个解决方法,即在没有人抛出newValue
之前模型不会改变,所以在PropertyVetoException
我首先检查我要保存在数据库中的数据是否是不等于模型中的数据,如果它相等,我只是忽略变化。
还有其他更好的解决方法吗?
答案 0 :(得分:1)
你的“解决方法”并不是真正的解决方法,但实际上听起来像是对我的正确解决方案:确认在尝试“更改”持久版本之前,对象的当前状态实际上已发生了变化。这也会更有效(数据库访问很昂贵)。
答案 1 :(得分:0)
您应该在更改模型之前检查Vetoable更改,而不是在...之后检查
即:如果出现问题,模型不会更改,如果更改错误则不会还原模型
答案 2 :(得分:0)
要:timyates
这正是我做的事情,我回忆起事件,尝试更新数据库,但它失败了,我抛出异常否决了更改,因此模型没有更新,但问题是VetoableChangeSupport通知我如果我不做我在问题中解释的解决方法
,那就拥有自己的否决权