代码阅读小记

78 阅读1分钟
  1. @EqualsAndHashCode(callSuper=true)

看到项目代码中有这么一段:

	@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 <!--全局配置@EqualsAndHashCodetrue-->