lombok注解@Data使用在继承类上时出现警告的问题及解决
作者:吴名氏.
lombok为我们提供了@Data注解,帮助我们省略了@Setter,@Getter,@ToString等注解,一般对于普通的实体类使用该注解,不会出现什么问题,但是当我们把这个注解,使用在派生类上,就出现了一个警告
1 情景再现
- 父类:
@Data public class BaseEntity { /** * 公共字段主键id */ private Integer id; /** * 公共字段创建时间 */ private Date createTime; /** * 公共字段更新时间 */ private Date updateTime; }
- 子类:
@Data public class User extends BaseEntity { /** * 用户名 */ private String username; /** * 密码 */ private String password; }
此时,idea中显示,在子类的@Data注解的地方会出现警告,如图:
出现的警告信息:
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
大致意思是默认子类的equals和hashCode方法,不会包含或者考虑基类的属性。
我们可以通过反编译工具查看项目target/classes目录下的User.class的hashCode方法,默认情况下属性都是使用的他自身的属性。
public int hashCode() { int PRIME = 59; int result = 1; Object $username = getUsername(); result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $password = getPassword(); result = result * 59 + ($password == null ? 43 : $password.hashCode()); Object $mobile = getMobile(); result = result * 59 + ($mobile == null ? 43 : $mobile.hashCode()); return result; }
2 解决方案一(添加注解)
在警告的父类加上注解@EqualsAndHashCode(callSuper=true) ,警告消失
这时候,我们再来看我们的User.class中的hashCode方法:
public int hashCode() { int PRIME = 59; int result = super.hashCode(); Object $username = getUsername(); result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $password = getPassword(); result = result * 59 + ($password == null ? 43 : $password.hashCode()); Object $mobile = getMobile(); result = result * 59 + ($mobile == null ? 43 : $mobile.hashCode()); return result; }
可以看出代码中不一样的地方,默认情况下是int result=1,当添加注解@EqualsAndHashCode(callSuper=true)时,变成了int result=super.hashCode()。
这么一来,好像就解决了在继承情况下使用@Data注解的警告问题。
但是问题是,每一个继承的类,都需要这么来解决,也不是很方便。所以,lombok作者Roel也给出了解决办法,就是通过自定义lombok.config文件来解决。
3 解决方案二(配置lombok.config)
lombok.config文件需要放在src/main/java文件夹下的目录中(也可以放在实体同级目录下),放在src/main/resources目录下,不会生效。
下面,我们通过这种方式来解决这个警告的问题。
- 3.1 新建lombok.config文件,然后配置:
config.stopBubbling=true lombok.equalsAndHashCode.callSuper=call
- 3.2 pom.xml文件中需要加入如下插件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
经过上两步步骤警告已经消失,如图:
可以看到,配置生效了,然后@Data注解这里的警告也立马消失了。
4 说明
如果父类没添加@Data注解,子类如果要去掉警告的话,也需要在子类@EqualsAndHashCode(callSuper=true)注解
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。