当前位置: 代码网 > it编程>编程语言>Java > lombok注解@Data使用在继承类上时出现警告的问题及解决

lombok注解@Data使用在继承类上时出现警告的问题及解决

2024年10月23日 Java 我要评论
lombok为我们提供了@data注解,帮助我们省略了@setter,@getter,@tostring等注解,一般对于普通的实体类使用该注解,不会出现什么问题,但是当我们把这个注解,使用在派生类上,

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com