相同类的两个实例之间的差异

时间:2010-08-11 01:38:03

标签: java javabeans

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

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

我认为我可以使用反射,但这些类非常复杂,可能会出错。

4 个答案:

答案 0 :(得分:4)

你的问题有点不清楚。首先你说“同一类的两个实例”,然后你说“课程非常复杂”。这是一个通用的解决方案,可以找到任何类的实例之间的差异,还是仅仅是一个特定的案例?另一个含糊不清的地方就是“复制差异”。例如,如果它是一个String,那么将被复制到新实例的两个字符串之间的差异是什么?如果它是一个集合,那么集合之间的差异是什么?如果您有两个在不同顺序中具有相同内容的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的。他们甚至有一个反射版本的实用程序。看看他们如何处理深浅的平等。

答案 1 :(得分:2)

如果你想一般地使用反射,除了使用反射之外别无他法。如果您的字段有getter,那么您可以继续将其与equals方法进行比较。然后你在编译时就知道了这些字段。

答案 2 :(得分:1)

写一个类似

的方法
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”并包含你想在diff中忽略的字段名称。

答案 3 :(得分:0)

你需要小心。此问题的某些公式与已知为Subgraph Isomorphism ProblemNP complete基本相同。