【问题标题】:Test if two objects are structurally equal?测试两个对象在结构上是否相等?
【发布时间】:2013-04-29 02:59:27
【问题描述】:

我有一个包含不同部门和员工的公司对象。我已成功序列化我的对象并再次将其加载到我的程序中。

现在我想测试这两个对象在结构上是否相等。 java 是否为我提供了比较这些对象的工具?

我应该补充一点,我的对象有一个包含其他对象的列表。

或者我必须为此编写自己的测试吗?

编辑:

class test{

public int a

}
test t = new test();
t.a = 1;

test t1 = new test();
t1.a = 1;

现在我想根据它们的值比较 t 和 t1 是否相同。

【问题讨论】:

标签: java


【解决方案1】:

您可以重写Test 类中的equals 方法,如下所示:

public boolean equals(Object other) {
    if (other == null) {
       return false;
    }
    if (!(other instanceof Test)) {
       return false;
    }
    return this.a == ((Test) other).a;
}

另外:当覆盖 equals 时,你也应该总是覆盖 hashCode 方法。请参阅此参考资料了解原因:Why always override hashcode() if overriding equals()?

【讨论】:

  • 在覆盖等于时总是覆盖哈希码。这应该是您答案的一部分。您的 equals 方法签名是错误的。 -1 直到您更正此问题,因为您推荐的内容将不起作用,更糟糕的是会误导。提示:方法参数!
  • 如果你使用的是Eclipse,它可以为你生成hashCode和equals。
  • @HovercraftFullOfEels:哎呀。已编辑。
  • 你还没有提到 hashCode。为什么?我已经添加到您的答案中,因为您没有打扰这样做。
  • 您不需要if (x) return true else return false,只需return x。这有助于提高可读性。
【解决方案2】:

听起来你可以与我认为覆盖的 equals 方法进行比较......

【讨论】:

    【解决方案3】:

    Google Guava 提供ComparisonChain:

       public int compareTo(Foo that) {
         return ComparisonChain.start()
             .compare(this.aString, that.aString)
             .compare(this.anInt, that.anInt)
             .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
             .result();
       }
    

    Apache Commons 提供CompareToBuilder:

       public int compareTo(Object o) {
         MyClass myClass = (MyClass) o;
         return new CompareToBuilder()
           .appendSuper(super.compareTo(o)
           .append(this.field1, myClass.field1)
           .append(this.field2, myClass.field2)
           .append(this.field3, myClass.field3)
           .toComparison();
       }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多