• Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用


    转:(11条消息) Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用_请叫我大师兄-CSDN博客_equalsandhashcode

    这个注解的作用就是自动的给model bean实现equals方法和hashcode方法。

    但是,这个参数,callsuper = false 有问题吗?

    你在使用这个注解的时候,确定知道“为什么要重写hashcode和equals方法吗?”

    先看下面的测试。

    两个model的代码我就截图啦:父类 TV.java 和 子类 小米TV.java,使用这个注解@EqualsAndHashCode(callSuper = false) 

     

    小米tv继承tv,从继承角度讲tv有的属性,小米tv也是有的。

    看测试main方法

    import com.lxk.model.XiaoMiTV;
    
    /**
    * 测试@EqualsAndHashCode注解的使用
    *
    * @author LiXuekai on 2019/5/10
    */
    public class EqualsAndHashCodeTest {
    public static void main(String[] args) {
    XiaoMiTV tv1 = new XiaoMiTV("123", "lxk", 1L, "白");
    XiaoMiTV tv2 = new XiaoMiTV("456", "sql", 1L, "白");
    System.out.println(tv1.equals(tv2));
    }
    }

    来吧,大胆猜测一下,这个代码的运行结果。true还是false?

    猜完了,来看下运行结果图:

     

    这个因为咱在子类里面这么使用@EqualsAndHashCode(callSuper = false) ,不调用父类的属性,那么子类属性里面的相同的话,那hashcode的值就相同啦,所以代码里面的2个tv的equals方法的返回值是true

    那么,把@EqualsAndHashCode(callSuper = false) 的false改成true之后的结果呢?

    来,再猜测一下。

    猜完了,看运行结果(就只改@EqualsAndHashCode(callSuper = false) 里面的false改成true)

     

    这个估计就好猜了。@EqualsAndHashCode(callSuper = true),那就是用自己的属性和从父类继承的属性 来生成hashcode,比较的结果就好猜啦。

    那么,再把@EqualsAndHashCode(callSuper = false) 这个语句注释了呢?这个时候代码运行结果如何?

    来,还是再猜一下吧。

    猜完了,看下运行结果图

     

    竟然是true,原来他默认就是不管父类继承的属性的。

    看Lombok的提示:

    自动生成hashcode和equals方法,但是没call super,虽然这个class不是直接extends Object类,如果这是故意的,那么请加上@EqualsAndHashCode(callSuper = false) 这句话到你的model上。

    非常建议:

    去了解下为啥要重写hashcode和equals方法。要是说你觉得你造了,那再问一下,set为啥能去重复呢?刚刚那2个tv都放到一个set里面,能放进去吗?深入了解一下吧。

    因为set用hashcode确定位置,hashcode相同会被覆盖

    作者:你的雷哥
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    剑指offer——72圆圈中最后剩下的数字
    剑指offer——71扑克牌中的顺子
    剑指offer——70n个骰子的点数
    剑指offer——69队列的最大值
    剑指offer——68队列的最大值
    剑指offer——67左旋转字符串
    剑指offer——66翻转字符串
    剑指offer——65和为S的连续正数序列
    「日常训练」COMMON 约数研究(HYSBZ-1968)
    「暑期训练」「基础DP」免费馅饼(HDU-1176)
  • 原文地址:https://www.cnblogs.com/henuliulei/p/14900466.html
Copyright © 2020-2023  润新知