【问题标题】:how to equate two objects in javajava中两个对象相等的方法
【发布时间】:2012-02-29 11:56:55
【问题描述】:

有没有一种方法可以将两个对象等同起来?

我知道我们可以使用 equals,但问题是我需要编写一个实用程序来比较任何两个实现相同接口的对象。

现在对象可以有 1 个属性,或 2 个属性或可以有 100 个属性。我需要比较每个属性以证明完全相等。

【问题讨论】:

  • 您可以尝试使用反射来迭代两个对象的属性并进行比较。 (在您的问题中暗示您不要实现等于或比较器......)
  • @Ido。 CO:你能举个例子如何做同样的事情吗?我知道如何使用反射,但不确定如何使用。
  • 我会为你寻找一个好的例子。

标签: java equals


【解决方案1】:

您可以查看 Apache Commons 辅助类 EqualsBuilderHashCodeBuilder。这些类提供了为任何类构建良好的equalshashCode 方法的方法。

【讨论】:

    【解决方案2】:

    这可以使用反射来完成。如果您不想编写自己的实用程序,可以使用 Unitils 之类的东西,它提供了一个名为 ReflectionAssert 的类。

    另见Is there a Java reflection utility to do a deep comparison of two objects?

    【讨论】:

      【解决方案3】:

      如果不想实现equals或者comparator,可以尝试通过反射来实现。

      遍历两个对象字段并比较它们 -

      Field[] fields1 = o1.getClass().getDeclaredFields();
      Field[] fields2 = o2.getClass().getDeclaredFields();
      
      for (int i = 0; i++ ; i>fields.lenght) {
       // compare the two fields under the assumption that if the two
       // objects are the same their fields will be the same in each iteration
      }
      

      使用field.get(Object)检索字段的值

      由于可能涉及对象的嵌套和集合,因此您必须对每个元素递归地执行此操作,并且指针循环可能会出现问题。因此,如果您期望循环,则必须实施更复杂的解决方案(您必须存储实际指针。并检查您是否没有尝试递归比较相同的元素两次)。

      【讨论】:

      • 没那么容易。你如何处理嵌套集合?你如何确保你不会在一个循环中结束?实现这一点并非易事......
      • 关于比较集合——这个比较应该对每个元素递归地完成(或者使用它的equals实现代替)。关于周期 - 这是一个问题。如果你期望循环,你不应该使用这种方法(虽然有一个解决方案:解决记忆,但它很丑)
      猜你喜欢
      • 2013-10-27
      • 2012-02-13
      • 2020-02-12
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多