【问题标题】:java compare objects: using reflection?java比较对象:使用反射?
【发布时间】:2009-10-05 16:01:38
【问题描述】:

我有一个对象,它本身有多个对象作为字段。我的问题是,我有两个这样的对象,我想比较这两个。我知道我可以做等于、比较器等,但是有没有办法使用反射来获取对象的属性并进行比较。

例如,如果我有一个 Car 对象,它作为车轮对象,它有轮胎对象,它有螺栓对象。请记住,以上所有对象都是单独的,而不是嵌套类。如何比较 2 个汽车对象?

有什么帮助吗?

谢谢

【问题讨论】:

标签: java reflection object compare


【解决方案1】:

Apache Commons Lang 有一个 EqualsBuilder 类可以做到这一点(参见 reflectionEquals() 方法)

 public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this, obj);
 }

EqualsBuilder 还为特定字段的 null 安全比较提供了更明确的方法,这使得编写“正确”(即非反射)等于方法的工作量减少了一些。

【讨论】:

【解决方案2】:
public class Car {
  private Wheels wheels;
  // other properties

  public boolean equals(Object ob) {
    if (!(ob instanceof Car)) return false;
    Car other = (Car)ob;
    // compare properties
    if (!wheels.equals(other.wheels)) return false;
    return true;
  }
}

是正确的方法。不推荐通过反射进行自动比较。一方面,“状态”是一个比反映属性比较更通用的概念。

你可以写一些进行深度反射比较的东西,但它有点没抓住重点。

【讨论】:

  • 你需要添加检查 if ob == null return false, if ob == this return true 来完成equals方法。
  • instanceof 将处理 null 情况。 this 比较不是必需的,尽管它可能有助于提高性能。可能是错误的是将instanceof 与非final 类一起使用-创建类final(或者如果你真的必须使用Object.getClass)。
  • 同意 Tom 的观点,您可能不想编写 equals() 以使 Car 的子类可能等于 Car 的实例,因为这意味着您的 equals() 会不是对称的
  • 这似乎是我应该走的方向,网上的每一篇文章也都指向这个方向。感谢所有 cmets 家伙
【解决方案3】:

大多数现代 IDE 都有哈希码和等号生成器,可让您选择要考虑的属性。那些轻松地击败了反射性同行的表现。

【讨论】:

    【解决方案4】:

    这个想法很有趣,但请注意反思可能会很慢。如果您需要进行大量比较,或者您将对象放在进行比较的集合类中(例如HashMapHashSet 等),那么通过反射比较对象可能会成为性能瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多