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相同会被覆盖
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!