簡體   English   中英

警告 equals/hashCode 在帶有繼承的 @Data 注釋 lombok 上

[英]Warning equals/hashCode on @Data annotation lombok with inheritance

我有一個繼承自其他實體的實體。 另一方面,我使用 lombok 項目來減少樣板代碼,所以我放了@Data注釋。 帶有繼承的@Data注釋會產生下一個警告:

生成 equals/hashCode 實現但不調用超類,即使此類不擴展 java.lang.Object。 如果這是故意的,請將@EqualsAndHashCode(callSuper=false)到您的類型中。

是否建議添加注釋@EqualsAndHashCode (callSuper = true)@EqualsAndHashCode (callSuper = false) 如果沒有添加,它是callSuper=false還是callSuper=true

默認值為false 如果您不指定它並忽略警告,這就是您得到的。

是的,建議在@Data注釋的類上添加一個@EqualsAndHashCode注釋,這些類擴展了對象以外的其他內容。 我無法告訴您是否需要truefalse ,這取決於您的類層次結構,並且需要根據具體情況進行檢查。

但是對於項目或者包,如果不是Object的直接子類,可以在lombok.config配置調用super方法。

lombok.equalsAndHashCode.callSuper = call

請參閱有關其工作原理的配置系統文檔,以及有關支持的配置鍵的@EqualsEndHashCode文檔

披露:我是龍目島的開發人員。

@EqualsAndHashCode(callSuper=true)應該解決警告。

主要的原始問題是:

是否建議添加注解@EqualsAndHashCode (callSuper = true) 或@EqualsAndHashCode (callSuper = false)?

接受的答案基本上只是:

……那要看……

為了擴展這一點, @EqualsAndHashCode上的文檔有一些關於選擇的可靠指導。 尤其是這一點,恕我直言:

通過將 callSuper 設置為 true,您可以在生成的方法中包含超類的 equals 和 hashCode 方法。 對於hashCode,super.hashCode()的結果包含在hash算法中,對於forequals,如果super實現認為它不等於傳入的對象,則生成的方法將返回false。 請注意,並非所有 equals 實現都能正確處理這種情況。 但是,lombok 生成的 equals 實現確實可以正確處理這種情況,因此如果超類也有 lombok 生成的 equals 方法,您可以安全地調用它。

稍微提煉一下:如果您從沒有狀態信息的超類繼承,或者本身正在使用@Data 注釋,或者具有“正確處理情況”的 equals/hash 實現,請選擇“callSuper=true” - 我認為這意味着返回狀態值的正確散列。

如果您還想比較超類的成員,請使用@EqualsAndHashCode(callSuper=true) 但是,如果您只想比較當前類中的字段,則可以使用默認選項@EqualsAndHashCode(callSuper=false)

如果您使用Delombok -feature,您可以看到不同之處在於,當設置為true時, if (!super.equals(o)) return false;將此行添加到生成的equals方法中if (!super.equals(o)) return false; . 如果在比較兩個對象時應考慮超類中的成員,則必須將其設置為 true 才能正確比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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