生成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()
方法。
答案 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;
}
}
}
主要优点是您可以排除字段(顶部示例)并使用超类中的字段(第二个示例)。