解读@Data注解父子类继承的问题

 更新时间:2024年11月05日 14:19:28   作者:文迢  
在Java开发中,使用Lombok库的@Data注解简化了代码,但在父子类继承关系中使用@Data注解时会遇到问题,主要问题是:当父类和子类都使用@Data注解时,会导致equals方法不对称,解决方案是在子类中使用@EqualsAndHashCode注解

@Data注解父子类继承问题

父类子类都使用@Data注解的时候会导致:equals方法在父类中重写equals,可能不是对称的。问题。

解决方案

子类的注解添加以下

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)

使用@Data时默认@equalsandhashcode的状态为callsuper=false

  • @equalsandhashcode(callsuper=false)表达为在对象比较时不会考虑父类中的成员,仅仅比较子类中的属性就判断是否相同
  • @equalsandhashcode(callsuper=true)在比较时会考虑父类中的成员,通过父类和子类中的属性一起判断是否相同

子类加@Data后,IDEA调试时“出现”父类属性无值

项目场景

自测一个功能的时候,IDEA调试同过对象的VIEW查看对象内容,发现加了@Data的返回子类型中父类的属性没有出现。

问题描述

// 父类Response中的返回VO对象
 
@Data
public class PVO{
 
    private Sting serialNum;
}
 
 
// 子类拓展了父类属性
@Data
public class SVO extends PVO{
 
    private Sting userName;
}

接口返回对象为SVO,在debug代码过程中同过代码点击VIEW的时候查看对象内容,这时候没有“出现”父类的属性。

原因分析

其实同过VIEW的查看对象内容是根据对象的toString()方法展示的,在子类和父类都使用了@Data注解时,子类toString以及equal和toHash都不会将父类的属性带入进来,导致同过VIEW的时候不会出现父类的方法。

解决方案

1、调试的时候在IDEA控制台查看对象的属性值是准确的;

2、如果非要使用VIEW查看的话,在子类加上如下注解,这样就会引入父类方法。

@ToString(callSuper = true)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot集成shiro遭遇自定义filter异常的解决

    springboot集成shiro遭遇自定义filter异常的解决

    这篇文章主要介绍了springboot集成shiro遭遇自定义filter异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中jdk1.8和jdk17相互切换实战步骤

    Java中jdk1.8和jdk17相互切换实战步骤

    之前做Java项目时一直用的是jdk1.8,现在想下载另一个jdk版本17,并且在之后的使用中可以进行相互切换,下面这篇文章主要给大家介绍了关于Java中jdk1.8和jdk17相互切换的相关资料,需要的朋友可以参考下
    2023-05-05
  • Java HashMap在遍历时删除元素的实现

    Java HashMap在遍历时删除元素的实现

    本文主要介绍了Java HashMap在遍历时删除元素的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Java中的==、equals与hashCode区别与联系最佳实践

    Java中的==、equals与hashCode区别与联系最佳实践

    在Java开发中,==、equals和hashCode是三个高频出现的概念,也是初学者最容易混淆的知识点,本文将从底层原理出发,全面解析三者的区别、联系及最佳实践,帮你彻底理清它们的使用场景,感兴趣的朋友一起看看吧
    2025-09-09
  • 关于使用Mybatisplus自带的selectById和insert方法时的一些问题

    关于使用Mybatisplus自带的selectById和insert方法时的一些问题

    这篇文章主要介绍了关于使用Mybatisplus自带的selectById和insert方法时的一些问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java五子棋简单实现代码举例

    Java五子棋简单实现代码举例

    Java五子棋游戏是一种经典的两人对战棋类游戏,它基于简单的规则,即任何一方的棋子在棋盘上形成连续的五个,无论是横、竖还是斜线,都将获胜,这篇文章主要介绍了Java五子棋实现的相关资料,需要的朋友可以参考下
    2024-10-10
  • java删除文件夹的实现方式

    java删除文件夹的实现方式

    用户发现File.delete()无法删除非空目录,尝试自定义递归删除方法后,发现commons-io已提供FileUtils.deleteDirectory,建议优先使用第三方库避免重复造轮子,提升效率与代码可靠性
    2025-07-07
  • 记一次线程爆满导致服务器崩溃的问题排查及解决

    记一次线程爆满导致服务器崩溃的问题排查及解决

    这篇文章主要介绍了记一次线程爆满导致服务器崩溃的问题排查及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用

    JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 JDBC ,那么下面来教教大家传统JDBC的使用
    2022-09-09
  • 将15位身份证补全为18位身份证的算法示例详解

    将15位身份证补全为18位身份证的算法示例详解

    这篇文章主要给大家介绍了关于将15位身份证补全为18位身份证算法的相关资料,文中通过示例代码给大家介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06

最新评论