【lombok】equals相等返回false contains包含返回false? lombok注解的一个天坑

news2024/9/21 12:39:18

最近在写代码的时候 遇到个奇怪的问题 使用 list.contains(obj) 方法判断,明明是两个内容一样的对象,却返回了false

这里用伪代码还原一下场景:

// 从数据库取的所有数据
List<SysMenuDTO> allList = getDataFromDB();
// 一个id等于1的菜单对象 很明确属于上面的allList
SysMenuDTO menu = getDataFromDB(id = 1);
// res为false 
boolean res = allList.contains(menu) ; 

contains的源码 其实就是循环调用equals方法

我们都知道 equals方法需要重写 ,否则判断就是 == 比较,在java开发中,一般我们都是会使用lombok插件 注解形式简洁代码的。

// 生成get set等方法
@Data
// 重写equals和hashCode方法
@EqualsAndHashCode(callSuper = true)

检查 SysMenuDTO 实体类 确实也有注解,callSuper = true 表示父类也需要字段相等,equals才会返回true, SysMenuDTO 父类为 Tree
可以看到父类也是重写了equals方法
在这里插入图片描述

那么为什么还会出现问题呢?

只能跟踪equals方法的源码了,由于lombok生成的代码 在idea中 非常不方便调试,
我们直接把class文件里面的equals方法代码复制出来
并@EqualsAndHashCode注解去掉,手动调试

我们可以看到 有一行关键代码 如果父类equals方法判断为false 直接就返回false
在这里插入图片描述

而我们的Tree方法 是继承于BaseVO类,

public class BaseVO implements Serializable {

    public BaseVO() {
        super();
    }

}


BaseVO类中,为了简洁 并没有加上lomhok相关注解,这也导致BaseVO类并没有去重写equals方法,使用Object默认的 == 去比较,以至于子类Tree调用super.equals时 会返回false,至此真相大白

我们需要手动重写一下equals方法


    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof BaseVO)) {
            return false;
        } else {
        	// baseVo类中目前没其它字段 直接返回true
            return true;
        }
    }

对于super.equals这行代码,本身有没有问题 这里不做评价,
但对我们来说 无疑是一个坑点,毕竟给我们的直觉都是 已经重写过equals 就不会有问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Detectron2】代码库学习-3. LazyConfig 配置文件

目录1. 配置文件2. LazyConfig 导入导出3. 递归实例化4. 基于LazyConfig的训练步骤4.1 导入依赖库4.2 日志初始化4.3 训练4.4 评估4.5 训练流程4.6 主函数入口5. TipsDetectron2是Facebook AI Research(FAIR)推出的基于Pytorch的视觉算法开源框架&#xff0c;主要聚焦于目标检测…

进程的通信 - 邮槽

邮槽 邮槽是Windows系统提供的一种单向进程间的通信机制。对于相对简短的地坪率信息发送&#xff0c;使用邮槽通常比命名管道或者Unix域套接字更简单 使用邮槽通信的进程分为服务端和客户端。邮槽由服务端创建&#xff0c;在创建时需要指定邮槽名&#xff0c;创建后服务端得…

PIC单片机-测试例程汇总

内容包括PIC单片机常用外设的测试例程。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01;目录&#xff1a;一、端口的定义与while(1)的使用二、延时1、通过语句延时程序&#xff08;带参数&#xff09; 2、通过语句延时程序&…

N3-PEG-NHS,Azide-PEG-NHS,叠氮-聚乙二醇-活性酯可用来修饰蛋白质

一、详情介绍 1、名称 英文&#xff1a;N3-PEG-NHS&#xff0c;Azide-PEG-NHS 中文&#xff1a;叠氮-聚乙二醇-活性酯 2、描述 Azide-PEG-NHS的分子量&#xff1a;Azide-PEG-NHS 1k&#xff0c;叠氮-聚乙二醇-活性酯 2k&#xff0c;叠氮-PEG-活性酯 5k&#xff0c;N3-PEG-…

rr来debug你的C/C++程序(Linux)

如何用rr来debug你的C/C程序(Linux) 想象一下如果你的程序某时会崩溃&#xff0c;但是不能稳定复现&#xff0c;你会如何debug它? 用传统debugger面临的问题就是你不知道这次运行的时候能不能复现&#xff0c;你猜测可能某段代码出现了问题&#xff0c;所以进行了一番检查。…

柔性制造物料抓取及加工系统设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3六自由度并联机器人介绍 3 1.4研究主要内容 6 1.4.1主要设计要求 6 1.4.2技术参数 7 2柔性制造物料抓取及加工系统的结构及工作原理 8 2.1 并联运动机构概述 8 2.2 六自由度并联加工机器人总…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE5 排序评估指标5.1 Mean Reciprocal Rank (MRR)5.2 …

46-文本编辑器及文本处理

46-文本编辑器及文本处理常见文本编辑器linux文本编辑器介绍Linux文本编辑器-emacsLinux文本编辑器-nanoLinux文本编辑器- geditLinux文本编辑器- keditLinux文本编辑器- viLinux文本编辑器- vim使用vim编辑器vim基础操作-打开文件vim基础操作-移动光标vim基础操作–数据操作vi…

解决——》CommunicationsException:Communications link failure

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 解决——》CommunicationsException:Communications link failure1、操作2、现象3、原因4、解决1&…

大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【linux】登录审计

linux登录审计 桥接模式配置互联 VMware的“虚拟网络编辑器” 输入’nm-connection-editor’&#xff0c;配置以太网 为以太网连接配置网卡 配置ipv4 互ping ssh远程登录 ssh -l 用户名 ip地址exit退出ssh远程 [alexalexw-device ~]$ ssh -l alex 1.1.1.2 The au…

数据挖掘——RFM客户价值模型及航空公司客户分析实例

引言 背景信息时代的来临使得企业营销焦点从产品转向了客户&#xff0c;客户的管理关系成为企业的核心问题。客户的关系管理问题是客户分群。通过客户分群&#xff0c;进而区分无价值客户和高价值客户。高价值客户代表他们的消费会给企业带来利益最大。企业需要针对不同类别的…

易基因|病毒抗性:全基因组DNA甲基化揭示草鱼年龄相关病毒易感性的表观遗传机制

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年06月02日&#xff0c;淡水生态与生物技术国家重点实验室&#xff08;中国科学院水生生物研究所&#xff09;何利波副研究员为第一作者和通讯作者&#xff0c;汪亚平研究员为共同通…

智慧市政解决方案-最新全套文件

智慧市政解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧市政全套最新解决方案合集一、建设背景 随着中国经济的快速发展&#xff0c;城市化步伐不断加快&#xff0c;为了适应城市发展与管理的需求&#xff0c;解决城市市政管理过程中的问题&#…

PDPS软件:机器人控制输送带运行虚拟仿真操作方法

目录 概述 旋转台设备运动机构介绍 旋转台设备模型导入与安装 旋转台设备操作创建 机器人控制旋转台设备离线程序命令添加 仿真运行 概述 旋转台也是工业机器人生产线中常用的外围设备&#xff0c;工件安装在旋转台的夹紧机构上&#xff0c;旋转台通过旋转实现工作位置的…

【Linux】进程地址空间

文章目录一、前言二、什么是进程地址空间三、进程地址空间如何进行管理四、为什么会存在进程地址空间五、进程地址空间区域的严格划分一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间、文件系统以及多线程&#xff0c;这三部分内容很难但是非常重要&#xff1b…

[附源码]Python计算机毕业设计java高校社团管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

GitCode / 1024程序员开源挑战赛(10.23-11.14)

目录 csdn也有云计算了 这个挑战赛&#xff0c;主要是向大家宣布了&#xff0c;咱们csdn也有自己的云计算了&#xff01; 比较有特色的 云容器 云IDE 猿如意 也是有个有特色的工具&#xff0c;可以试用下。​编辑 问题 csdn也有云计算了 这个挑战赛&#xff0c;主…

0097 弗洛伊德算法,马踏棋盘算法

import java.util.Arrays; /* * 弗洛伊德算法 * 1.和迪杰斯特拉算法一样&#xff0c;弗洛伊德算法也是一种用于寻找给定的加权图中顶点间最短路径的算法 * 2.迪杰斯特拉算法用于计算图中某一顶点到其他顶点的最短路径 * 弗洛伊德算法计算图中各个顶点之间的最短路径 * …

IT就业专业为什么要选择大数据技术应用?

IT就业专业为什么要选择大数据技术应用&#xff1f;目前大数据领域从业人员的薪资高涨幅空间大&#xff0c;大数据人才供不应求。各大数据开发方向&#xff0c;数据挖掘、数据分析和机器学习方向&#xff0c;大数据运维和云计算方向。 一、大数据技术应用发展前景好&#xff1…