一、描述
- 如果没有继承,仅对一个类加上@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