一、描述
- 如果沒有繼承,僅對一個類加上@Data,不會有告警提示設置@EqualsAndHashCode(callSuper=false);
- 但存在繼承,就會有告警提示,如下:
用戶實體類User,繼承實體基類BaseEntity
package com.runlw.coody.test.entity; import lombok.Data; @Data public class User extends BaseEntity{ private String userName; private String password; }
package com.runlw.coody.test.entity; import lombok.Data; import java.util.Date; @Data public class BaseEntity { private Integer id; private Date createdDate; private Date updateedDate; }
編譯后,出現:
二、分析
如果在User類上加上注解@EqualsAndHashCode(callSuper = true)
package com.runlw.coody.test.entity; import lombok.Data; import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data public class User extends BaseEntity{ private String userName; private String password; }
查看編譯后的class,發現會多一個if (!super.equals(o)) 判斷
可以去掉注解@EqualsAndHashCode(callSuper = true),或者設置為false(默認值),將編譯后的class進行對比
三、解決方案
1.如果比較兩個對象時應考慮超類中的成員,請使用@EqualsAndHashCode(callSuper=true),才能正確比較
2.如果只是想在當前類比較字段,可以使用@EqualsAndHashCode(callSuper=false),或者不適用此注解,它是默認選項
3.設置 lombok 全局屬性,在src/main/java 目錄下創建 lombok.config 文件。【注:一定要在src/main/java 目錄下創建才有效】
# 聲明該配置文件是一個根配置文件,從該配置文件所在的目錄開始掃描 config.stopBubbling=true # 全局配置 equalsAndHashCode 的 callSuper 屬性為true lombok.equalsAndHashCode.callSuper=call
總結:
推薦使用注解@EqualsAndHashCode,因為可以區分哪些需要比較父類成員,哪些不需要比較父類成員;如果全部要比較 或 全部不需要比較 父類成員,則使用全局配置 lombok.config