在具有添加字段的类中自动更新equals()和hashCode()方法。

时间:2014-01-09 07:01:25

标签: java automation equals apache-commons hashcode

生成equals()hashCode()很简单,IDE有助于轻松生成它们。但是当时间过去时,可能会有更多新字段被添加到Objects。当项目的复杂性变得更高(代码中的对象使用次数变得更高)时,生成equals()hashCode()的时间可能会变得更加复杂。

此时刻向bean添加新字段,该人必须再次重新生成equals()hashCode()方法。如果有人忘记再生,这将导致失败。

我无法在添加新字段时自动更新equals()hashCode()。我用apache.commons.builder

找到了一些有趣的方法

现在我们可以通过以下方式覆盖equals()hashCode()

@Override
public boolean equals(Object o) {
    return EqualsBuilder.reflectionEquals(this, o);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

现在添加新字段不是问题,可以使用同一个equals()hashCode()

现在我的问题,是否有更好的方法来做到这一点。同样,我们也可以使用toString()方法。

3 个答案:

答案 0 :(得分:2)

equals和hashCode方法被调用太多次,例如,在许多集合中。我的投票将是避免在上述方法中使用反思。

番石榴有另一种解决方法。 AutoValue 报价

  

AutoValue提供了一种更简单的方法来创建不可变的值类,代码少得多,错误的空间也更少,同时不会限制您完全按照自己的方式编写类的几乎所有方面的自由。

答案 1 :(得分:1)

如果您需要速度,并且您的对象是不可变的,您可以使用慢速反射(或稍后懒洋洋地)在构造时计算一次哈希码并存储在字段中。

答案 2 :(得分:0)

Project Lombok是各种IDE的插件/库,可让您使用注释声明样板代码。他们有一个这样的注释:EqualsAndHashCode

以下是一些示例代码来说明用法:

  import lombok.EqualsAndHashCode;

   @EqualsAndHashCode(exclude={"id", "shape"})
   public class EqualsAndHashCodeExample {
   private transient int transientVar = 10;
   private String name;
   private double score;
   private Shape shape = new Square(5, 10);
   private String[] tags;
   private int id;

   public String getName() {
     return this.name;
   }

   @EqualsAndHashCode(callSuper=true)
   public static class Square extends Shape {
     private final int width, height;

     public Square(int width, int height) {
       this.width = width;
       this.height = height;
     }
   }
}

主要优点是您可以排除字段(顶部示例)并使用超类中的字段(第二个示例)。