java 两个Dto对象有字段数据不一致可Objects.equals方法却返回了一致?(问题分析与结论)

java 两个Dto对象有字段数据不一致可Object.equals方法却返回了一致?(问题分析与结论)

问题描述

以示意代码非原业务代码描述解释

基础类DownloadCenterBaseParam
在这里插入图片描述

子类 DashBoardQueryDto
在这里插入图片描述

新建两个对象并比对equals

    public static void main(String[] args) {ChannelReportNewVersionQueryDto dto1 = new ChannelReportNewVersionQueryDto();dto1.setCreateTimeBegin("2023-03-01");dto1.setCreateTimeEnd("2023-03-02");dto1.setPageNo(1);dto1.setPageSize(10);ChannelReportNewVersionQueryDto dto2 = new ChannelReportNewVersionQueryDto();dto2.setCreateTimeBegin("2023-03-01");dto2.setCreateTimeEnd("2023-03-02");dto2.setPageNo(3);dto2.setPageSize(10);System.out.println(Objects.equals(dto1, dto2));System.out.println(dto1.hashCode());System.out.println(dto2.hashCode());}
}

运行代码得到的结果,是不是有点懵,明明pageNo这个字段的值一个是1,一个是10,为啥equals还能相等呢?
在这里插入图片描述

原因是Lombok @Data注解生成了equals方法,equals方法里并没有对父类的字段进行比对
我们打开生成的字节码文件看看,可以看到并未比对父类的pageNo字段

在这里插入图片描述
到此,你弄懂了为啥这两个对象equals会返回相同,解决办法是加注解声明equals方法要比较父类的equals

@EqualsAndHashCode(callSuper = true)

在这里插入图片描述

加了注解之后我们再看看编译后的字节码文件
在这里插入图片描述

你以为这就完了?再来看看这个
基础类DogBaseDto
在这里插入图片描述

子类HuskyDto
在这里插入图片描述

测试类

在这里插入图片描述
运行结果显示两个对象不相等,怎么办,你懵了吗?我也懵了啊,再去看看字节码
在这里插入图片描述
可以从字节码看到,对父类做了equals比对!!!你猜为啥?你可能和我一样会去对比两个类的差别,最开始的类有@FieldNameConstants注解,后面的没有,但是测试过后,这个加或不加都不影响维持现状,另一个就是base类是否在一个目录下,这个测试了仍然不影响。(测试的时候要先删除已经生成的字节码!!!)目前暂未找到原因,要写需求去,我去提个issue试试(https://github.com/projectlombok/lombok/issues/3631),原因找到了,前面那个没有生成super.equals是因为那个类在该项目的api包下,没指定lombok配置,而后面建的类是在core包下,有个lombok.config指定了equals方法一定会调父类的equals。

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

误删了Linux系统的libm.so.6文件与libm-2.27.so的软链接导致的开机出现kernel panic的解决方案(图文U盘救援详细教程)

事情起因 最近在做嵌入式视觉,捣弄rknn3588,在推理过程中报了一个错,就是说我的GLIBC的版本太低了,我也没有多想,想着升一下版本就好了,然后找到了这篇博客。【请谨慎操作】Ubuntu18.04升级GLIBC_2.29&…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态:互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程(Concurrent programming)&#…

8节点空间壳单元Matlab有限元编程 | 曲壳单元 | 模态分析 | 3D壳单元 | 板壳理论| 【源代码+理论文本】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

蓝桥杯2023省赛:矩阵总面积|模拟、数学(几何)

题目链接: 0矩形总面积 - 蓝桥云课 (lanqiao.cn) 说明: 参考文章:矩形总面积计算器:计算两个矩形的总面积,包括重叠区域_矩形r1的左下角坐标为x1, yl 、宽度为w1、高度为h1, 矩形r2的左下角坐标为x2,y2、宽-CSDN博客…

【开发环境搭建篇】Redis客户端安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

Linux系统资源管理

Linux系统资源命令 在Linux中查看系统资源常用命令有哪些 在Linux中,系统资源是指计算机硬件、软件和网络设备等可以利用的一切物质和能量。Linux中的系统资源包括: CPU(中央处理器):用于处理计算机中的指令和数据的…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.23-03.29 #16场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2024-03-23(周六) #7场比赛2024-03-24…

MQTTnet实现客户端连接

使用MQTTnet(Version=4.3.1.873)库实现多客户端连接多服务端,同时实现断线重连; 如下图所示,开启3个客户端连接3个服务端,当其一个服务端出现异常(服务停止,网络异常无法连接)导致连接断开时,实现每5秒连接一次 MQTT连接服务核心类:业务需求是一个客户端对应的一个MQ…

小迪安全43WEB 攻防-通用漏洞任意文件下载删除重装敏感读取黑白审计

#知识点: 1、文件操作类安全问题 2、文件下载&删除&读取 3、白盒&黑盒&探针分析 #详细点: 文件读取:基本和文件下载利用类似 文件下载:利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路 …

【unity之UI专题】GUI(IMGUI)详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

这个简单的生活方式,为你带来满满的幸福感

在今天文章的开头,我想请你思考一个问题:影响幸福感的最大因素是什么? 不妨先想一想,再往下拉,继续阅读。 可能不少朋友的回答,会是财富、事业、理想、生活环境、社会地位…… 这些因素当然对幸福感都非常重…

【OpenGL手册19】几何着色器

目录 一、说明 二、渲染管线的逻辑 三、几何着色器 四、使用几何着色器 五、造几个房子 六、几何着色器渲染爆破物体 一、说明 如果说用顶点和片段着色器干了什么,其实不多。加入几何着色器,能够加大渲染能力,简化数据结构,…