![](/img/trans.png)
[英]How to implement the equals/hashCode methods for classes that contain double fields
[英]Automatically updating equals() and hashCode() methods in classes with added fields.
生成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()
方法。
equals和hashCode方法被調用太多次,例如,在許多集合中。 我的投票將是避免在上述方法中使用反思。
番石榴有另一種方法。 AutoValue報價
AutoValue提供了一種更簡單的方法來創建不可變的值類,代碼少得多,錯誤的空間也更少,同時不會限制您自由地按照您希望的方式編寫幾乎任何類的方面。
如果您需要速度,並且您的對象是不可變的,您可以使用慢速反射(或稍后懶洋洋地)在構造時計算一次哈希碼並存儲在字段中。
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;
}
}
}
主要優點是您可以排除字段(頂部示例)並使用超類中的字段(第二個示例)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.