lombok注解@Data使用在继承类上时出现警告解决方案

文章介绍了在使用Lombok的@Data注解时,如果应用在继承类上会出现关于equals和hashCode方法的警告。通过添加@EqualsAndHashCode(callSuper=true)注解或配置lombok.config文件可以消除警告。同时,提到如果父类没有@Data注解,子类也需要添加@EqualsAndHashCode(callSuper=true)来处理警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)注解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴名氏.

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值