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

文章探讨了Java中使用Lombok的@Data注解自动生成的equals方法在比较Dto对象时可能出现的问题,尤其是在父类字段没有被正确考虑的情况下。作者通过实例展示了如何影响equals行为以及如何通过修改注解或配置解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HumorChen99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值