【问题标题】:Check whether a Java Object has been modified检查Java对象是否被修改
【发布时间】:2014-04-29 22:58:15
【问题描述】:

我想使用干净/自动的方式来检查 Java 对象是否已被修改。
我的具体问题如下:

在我的 Java 应用程序中,我使用 XStream 库将 XML 反序列化为 Java 对象,然后用户可以修改或更改它们。我想要一种方法来检查内存中的这些对象是否在某些时候与序列化的对象不同,因此我可以通知用户并询问他是否要保存更改(即使用 XStream 进行序列化)。 在我的应用程序中有很多对象并且非常复杂。

请考虑到我在我的应用程序中不使用数据库,所以我对使用 hibernate 之类的解决方案不感兴趣。

【问题讨论】:

  • 实现一个计数器,每次更改后递增值。
  • “不同”是什么意思?类更改新的/删除的字段,或者只是相同字段中的不同值?
  • 也许extends Observable 并实现所需的Observer(s)?

标签: java xml xstream


【解决方案1】:

两种方法:

  • 为您的对象实施哈希码,并将内存中对象的哈希码与序列化对象的哈希码进行比较,以查看它们是否已更改。这对您的类设计影响很小,但随着对象数量的增加,性能会下降 O(n^2)。请注意,两个对象可能返回相同的哈希码,但一个好的哈希实现将使这不太可能发生。如果您对此感到担忧,请实现并使用您自己的 equals() 方法。
  • 让您的对象实现Observer pattern 并让每个setter 方法或任何其他修改对象的方法在调用它时通知观察者。大量对象的性能会更好(只要它们不是不断变化的),但它需要您将 Observer 代码引入可能的轻量级类中。 Java 提供了utility interface for Observable,但您仍然需要完成大部分工作。

【讨论】:

  • 谢谢,关于 hashcode 方法的 Java 文档说,从一个应用程序的一次执行到同一应用程序的另一次执行,该方法产生的整数不需要保持一致。有没有办法保证它保持不变?
  • 这适用于使用对象内存地址进行哈希的自动生成的哈希码。您可以实现自己的哈希码,以便每次为具有相同内部字段的对象生成相同的哈希。请注意,散列算法可能会为两个不同的对象返回相同的散列码。一个好的散列算法将使这种不太可能的购买并非不可能。我用这个警告更新了我的答案。请参阅stackoverflow.com/questions/113511/hash-code-implementation 了解实现您自己的良好哈希码的方法。
【解决方案2】:

您可以在此对象中存储版本字段,每当对象更改时,它应该更新其版本字段(增加它),然后您可以将版本字段与序列化的对象版本字段进行比较

【讨论】:

  • 谢谢,我已经考虑过了,但我想知道是否有更自动的方法。事实上,我还必须考虑已做出和未做出的更改,这很复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
相关资源
最近更新 更多