【问题标题】:What is the best way to determine if Object has been changed?确定对象是否已更改的最佳方法是什么?
【发布时间】:2010-02-27 08:50:48
【问题描述】:

我在我的 Java Web 应用程序(JSF1.2、RichFaces)中创建了一些“保存”bean 功能。它使用 JAXB 将其转换为 XML 字符串,然后将其存储在数据库中。如果用户将其加载回来,我想通知用户(bean)内容是否已更改并且应该再次保存。

我的想法是重写hashCode() 函数'with'org.apache.commons.lang.builder.HashCodeBuilder,但是我有很多字段和子元素。 有没有其他方法来处理这种功能?

编辑

“比较”是在另一个视图上完成的!

任何帮助将不胜感激!

【问题讨论】:

  • 如果您选择基于 hashCode 的解决方案,请记住相应地修改您的 equals() 方法。除此之外,我同意您应该在实例级别添加一个“修改”标志,确保所有更改都通过 setter 方法,并修改每个 setter,以便如果它接收到的值与已经存储在属性它设置标志。每次写入或重新读取对象时清除它。

标签: java hashcode savechanges


【解决方案1】:

您可以在 bean 中添加 boolean dirty; 标志,在您的设置器中将其设置为 true,并在重新加载和保存后清除它。

【讨论】:

  • 好吧,在你的设置器和以任何方式修改任何变量的任何其他方法中。或者确保你的 setter 是唯一这样的方法。
  • 问题是用户可以提交相同的值,导致调用所有的setter方法。
  • 如果设置器检查值是否已更改,则此方法有效。仍然有很多冗余代码,但可以工作。
【解决方案2】:

您不能仅依靠hashCode 来确定对象是否已更改。也就是说,仅仅因为对象具有与以前相同的hashCode,并不意味着它没有被更改。

【讨论】:

  • 但是假设hashCode 计算中使用的字段已更改。我可以依靠具有与以前不同的hashCode 的对象,不是吗?
  • @user321068 不一定。一个好的散列函数会使对象在修改后不太可能保持相同的散列码,但这并不是一个严格的保证。
  • user321068,上面的答案回答了你的问题,不是吗?唯一的保证是:如果一个对象没有改变,它的hashCode保持不变。
【解决方案3】:

您可以使用 Java 的 MD5 功能:

MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(myObject);
byte[] hash = digest.digest();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多