zoukankan      html  css  js  c++  java
  • lombok注解@Data使用在继承类上时出现警告(转载)

    lombok为我们提供了@Data注解,帮助我们省略了@Setter,@Getter,@ToString等注解,一般对于普通的实体类使用该注解,不会出现什么问题,但是当我们把这个注解,使用在派生类上,就出现了一个小问题。

    基类:

    派生类:

    @Data注解的地方会出现警告:

    出现的警告信息:

    Generating equals/hashCode implementation but without a call to superclass, even though this classdoes 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;
    }

    当我们根据警告提示,加上注解@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注解的警告问题。但是问题是,每一个继承的类,都需要这么来解决,也不是很方便。在stackoverflow上,就有人提出了这个问题:https://stackoverflow.com/questions/38572566/warning-equals-hashcode-on-data-annotation-lombok-with-inheritance,另外,lombok作者Roel也给出了解决办法,就是通过自定义lombok.config文件来解决。

    按照Roel的说法,lombok.config文件需要放在src/main/java文件夹下的目录中(也可以放在实体同级目录下),放在src/main/resources目录下,不会生效。下面,我们通过这种方式来解决这个警告的问题。

    1、新建lombok.config文件,然后配置:

    config.stopBubbling=true
    
    lombok.equalsAndHashCode.callSuper=call

    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注解这里的警告也立马消失了。  

     
    原文链接:https://blog.csdn.net/feinifi/article/details/85275280
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    二分多重匹配(HDU5093)
    2-sat(and,or,xor)poj3678
    某个点到其他点的曼哈顿距离之和最小(HDU4311)
    第k最短路A*启发式搜索
    求树的直径和中心(ZOJ3820)
    并查集hdu4424
    map容器结构体离散化
    二维坐标系极角排序的应用(POJ1696)
    【进阶3-3期】深度广度解析 call 和 apply 原理、使用场景及实现(转)
    判断js数据类型的四种方法,以及各自的优缺点(转)
  • 原文地址:https://www.cnblogs.com/name-lizonglin/p/14408983.html
Copyright © 2011-2022 走看看