人菜勿喷,只是记录下。
看到项目代码里中有这么一段
@Data
@EqualsAndHashCode(callSuper=true)
public class Entity{
//省略
}
@Data 已经有@Getter,@Setter,@toString,@RequiredArgsConstructor 和@EqualsAndHashCode了,为什么还要再写个@EqualsAndHashCode?
在派生类里用@Data 可能会有问题,@EqualsAndHashCode默认是false,那么在做equals()的时候就不会比较父类的属性,因此可能出现明明不等的两个对象equals之后返回true了。所以为了能够正确的比较,将callSuper改为true,意思是带上父类的属性一起比较。
举例:
A是父类,有id这个属性
B,C都继承A,他们还有name属性
B,C比较的时候,name都相等,id不等
@Data(或者默认的@EqualsAndHashCode) equals之后的结果: true //因为没有比较父类的id属性
@EqualsAndHashCode=true equals之后的结果: false //比较父类的id属性,发现不同
项目里肯定有很多子类的,每个都这么写也不太现实哈(其实也不麻烦,挺现实的)
可以加个配置文件lombok.config,在里面写所有子类都要比较父类属性,一次到位哈
<!--lombok.config-->
config.stopBubbling = true <!--声明是根配置文件,从配置文件所在目录开始扫描-->
lombok.equalsAndHashCode.callSuper = call <!--全局配置@EqualsAndHashCode为true-->
写了好几个lombok.config的话,是有个就近原则的哈,(子比父近)子级的配置优先哈