簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM