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


# Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图1请叫我大师兄_2019-05-10 13:56:01Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图262643Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图3收藏168分类专栏:java文章标签:JavahashcodeequalsLombok版权Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图4java专栏收录该内容138 篇文章12 订阅订阅专栏这个注解的作用就是自动的给model bean实现equals方法和hashcode方法。但是,这个参数,callsuper = false 有问题吗?你在使用这个注解的时候,确定知道“为什么要重写hashcode和equals方法吗?”先看下面的测试。两个model的代码我就截图啦:父类 TV.java 和 子类 小米TV.java,使用这个注解@EqualsAndHashCode(callSuper = false) Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图5小米tv继承tv,从继承角度讲tv有的属性,小米tv也是有的。看测试main方法12importcom.lxk.model.XiaoMiTV;34/*5 测试@EqualsAndHashCode注解的使用67@authorLiXuekai on 2019/5/108*/9publicclassEqualsAndHashCodeTest{10publicstaticvoidmain(String[] args){11XiaoMiTV tv1 =newXiaoMiTV(“123”,”lxk”,1L,”白”);12XiaoMiTV tv2 =newXiaoMiTV(“456”,”sql”,1L,”白”);13System.out.println(tv1.equals(tv2));14}15}来吧,大胆猜测一下,这个代码的运行结果。true还是false?猜完了,来看下运行结果图:Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图6这个因为咱在子类里面这么使用@EqualsAndHashCode(callSuper = false) ,不调用父类的属性,那么子类属性里面的相同的话,那hashcode的值就相同啦,所以代码里面的2个tv的equals方法的返回值是true那么,把@EqualsAndHashCode(callSuper = false) 的false改成true之后的结果呢?来,再猜测一下。猜完了,看运行结果(就只改@EqualsAndHashCode(callSuper = false) 里面的false改成true)Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图7这个估计就好猜了。@EqualsAndHashCode(callSuper = true),那就是用自己的属性和从父类继承的属性 来生成hashcode,比较的结果就好猜啦。那么,再把@EqualsAndHashCode(callSuper = false) 这个语句注释了呢?这个时候代码运行结果如何?来,还是再猜一下吧。猜完了,看下运行结果图Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 - 图8竟然是true,原来他默认就是不管父类继承的属性的。看Lombok的提示:自动生成hashcode和equals方法,但是没call super,虽然这个class不是直接extends Object类,如果这是故意的,那么请加上@EqualsAndHashCode(callSuper = false) 这句话到你的model上。非常建议:去了解下为啥要重写hashcode和equals方法。要是说你觉得你造了,那再问一下,set为啥能去重复呢?刚刚那2个tv都放到一个set里面,能放进去吗?深入了解一下吧。