【问题标题】:Diff between two instances of same class [duplicate]同一类的两个实例之间的差异[重复]
【发布时间】:2010-08-11 01:38:03
【问题描述】:

我有同一个类的两个实例。我需要找到它们之间不同的属性(基本上是属性的值,比如 firstName 可能在两者中不同)。这些字段是原始的、复杂的以及集合。

基本上,我需要找到两个实例之间的差异,如果两个实例中的字段不同,我会将字段的值从第一个实例复制到第三个实例(差异对象)。

我想我可以使用反射,但是这些类非常复杂,并且可能容易出错。

【问题讨论】:

标签: java javabeans


【解决方案1】:

你的问题有点不清楚。首先您说“同一类的两个实例”,然后您说“类非常复杂”。这是查找任何类的实例之间差异的通用解决方案,还是只是一个特定情况?另一个歧义是“复制差异”的意思。例如,如果它是一个字符串,那么将被复制到新实例中的两个字符串之间的差异是什么?如果它是一个集合,那么集合之间的区别是什么?如果你有两个 ArrayLists 有相同的东西以不同的顺序怎么办。

如果是特定情况,那么您可以在传递同一类的实例的类上创建一个方法。然后您可以遍历每个字段并比较差异。

public TheClass difference(TheClass that) {
  TheClass newClass = new TheClas()
  if (this.getName().equals(that.getName()) == false ) {
    newClass.setName(that.getName());
  }
  ...
}

但这可能会失控,具体取决于您的对象图有多深。

如果您正在尝试构建通用/可重用的解决方案,那么构建器模式可能会派上用场。您可能会查看 Apache Commons 代码库并了解它们如何实现 HashCodeBuilder 和 ToStringBuilder。他们甚至有实用程序的反射版本。看看他们如何处理深层和浅层的平等。

【讨论】:

  • “但这可能会失控,具体取决于您的对象图有多深” ...如果图不是树形结构,它会变得更加复杂。
【解决方案2】:

如果您想通用地使用反射,没有其他方法可以使用。如果您的字段有吸气剂,那么您可以继续将其与equals 方法进行比较。然后你就知道编译时的字段了。

【讨论】:

  • 这是一个难题。由于对象实际上是变相的指针,因此需要能够区分 x.a 和 x.b 指向同一个对象,以及 x.a 和 x.b 指向两个不同的对象,它们彼此相等。顺便说一句,所有成员和成员成员都必须正确实现IComparable,或类似的东西。此外,我认为差异计算器将很难比较字典。是什么让两个字典或集合相等?它们在引擎盖下是否必须相同?
【解决方案3】:

写一个方法

public YourClass diff(YourClass other) {
    // diff code here
}

public static YourClass diff(YourClass first, YourClass second) {
    // diff code here
}

并围绕实现包装一些单元测试。

反射可能看起来更复杂,但它有以下优点:

1) 它可以是通用的,您可以使相同的代码适用于任何类
2) 如果类发生变化,则不必更改。

如果你想使用反射,你可以使用 Class.getDeclaredFields() (google for "java class api 6") 来获取类上的所有字段,然后你可以使用 Field api 来获取值对于一个对象。如果你想真正花哨,你有一个静态 String[] "diffIgnoredFields" 并在差异中包含你想忽略的字段名称。

【讨论】:

  • -1。这个答案没有为实际具有挑战性的部分提供任何实现细节。
  • @hvgotcoes,是的。我取消了我的反对票。 “这里的差异代码”对于如何编写差异代码的问题并不是一个很好的答案。
  • @mike 是的,我同意——我很困惑,因为 OP 似乎想要避免反思。如果他想避免反思,AFAIK 他对如何进行的选择有限——他必须自己动手。
【解决方案4】:

你需要小心。这个问题的一些表述与已知的NP completeSubgraph Isomorphism Problem 基本相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多