解读@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)

总结

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

相关文章

  • Java实战宠物店在线交易平台的实现流程

    Java实战宠物店在线交易平台的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Springboot+maven+Mysql+FreeMarker实现一个宠物在线交易系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • java控制台实现聊天程序

    java控制台实现聊天程序

    这篇文章主要为大家详细介绍了java控制台实现聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java GC 机制与内存分配策略详解

    Java GC 机制与内存分配策略详解

    这篇文章主要介绍了Java GC 机制与内存分配策略详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • springboot基于Mybatis mysql实现读写分离

    springboot基于Mybatis mysql实现读写分离

    这篇文章主要介绍了springboot基于Mybatis mysql实现读写分离,需要的朋友可以参考下
    2019-06-06
  • Java内存模型(JMM)及happens-before原理

    Java内存模型(JMM)及happens-before原理

    这篇文章主要介绍了java内存模型(JMM)及happens-before原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 浅谈springboot 属性定义

    浅谈springboot 属性定义

    本篇文章主要介绍了浅谈springboot 属性定义,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java使用Calendar类实现动态日历

    Java使用Calendar类实现动态日历

    这篇文章主要为大家详细介绍了Java使用Calendar类实现动态日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 详解idea搭建springboot+mybatis框架的教程

    详解idea搭建springboot+mybatis框架的教程

    这篇文章主要介绍了详解idea搭建springboot+mybatis框架的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • springboot+jwt+微信小程序授权登录获取token的方法实例

    springboot+jwt+微信小程序授权登录获取token的方法实例

    本文主要介绍了springboot+jwt+微信小程序授权登录获取token的方法实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 浅谈java的byte数组的不同写法

    浅谈java的byte数组的不同写法

    下面小编就为大家带来一篇浅谈java的byte数组的不同写法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论