使用Lombok子类继承父类,父类属性不生效问题及解决

 更新时间:2024年10月25日 09:35:58   作者:写....写个大西瓜  
在使用Lombok库时,若子类继承父类,父类的属性可能不会自动生效,为解决此问题,可通过在父类上添加@Getter和@Setter注解,或使用@SuperBuilder注解来确保父类属性在子类中有效,同时,需注意确保Lombok版本一致且正确配置了相关插件

使用Lombok子类继承父类,父类属性不生效

子类增加:

@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Data
@Entity
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class SysRights extends BaseEntity {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String rightsId;
    private String rightsName;
    private String rightsUrl;
    private String rightsIcon;
}

问题解决~~~~

Lombok 继承时应注意的点

lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法。

即它最终能够达到的效果是:

在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法

继承时的@Data

我们知道@Data注解在类,为类的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同时为所有非final字段注解@Setter。

要注意@EqualsAndHashCode注解与@ToString注解默认情况下是忽略父类的成员变量的,测试代码如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class School {
 
  public int id;
 
  public String name;
 
  public String age;
 
}
 
@Data
class ShangHai extends School {
  private String type;
}
 
 
class test {
 
  public static void main(String[] args) {
    ShangHai shangHai = new ShangHai();
    shangHai.setId(1);
    shangHai.setName("上海大学");
    shangHai.setType("A");
 
    ShangHai shangHai2 = new ShangHai();
    shangHai2.setId(2);
    shangHai2.setName("华东师范");
    shangHai2.setType("A");
 
    System.out.println(shangHai.equals(shangHai2));
    System.out.println(shangHai.toString());
    System.out.println(shangHai2.toString());
 
  }
}

它的打印结果是:

true
ShangHai(type=A)
ShangHai(type=A)

在此可以发现,上述的两个实例没有对比父类的成员变量是否相同,仅仅对比的type字段的值,所以是true。同理,toString方法是不会打印父类的成员的。

使父类成员变量参与到逻辑中

这个解决很简单,仅仅需要给注解带上一个参数:

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
class ShangHai extends School {
  private String type;
}

打印结果

true
ShangHai(super=School(id=1, name=上海大学, age=null), type=A)
ShangHai(super=School(id=2, name=华东师范, age=null), type=A)

注意:

由上述的代码演示,我们可以知道,在类继承的情况时应注意@Data注解不会涉父类的成员的坑,需要加callSuper = true的参数。

总结

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

相关文章

  • Java的@Repeatable注解使用详细解析

    Java的@Repeatable注解使用详细解析

    这篇文章主要介绍了Java的@Repeatable注解使用详细解析,java8新增了注解@Repeatable,在hibernate-validator的源码注解如@MAX、@NotNull等中,有@Repeatable注解的使用,需要的朋友可以参考下
    2024-02-02
  • SpringBoot集成Redis实现订单超时管理的详细步骤

    SpringBoot集成Redis实现订单超时管理的详细步骤

    文章描述了如何使用Redis来处理超时支付订单,包括引入依赖、配置连接、定义实体类、实现服务和监听器等步骤,文章讨论了优化方案、注意事项以及Redis的性能和可靠性问题,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Mybatis-Plus自定义集合类型的类型处理器详解

    Mybatis-Plus自定义集合类型的类型处理器详解

    这篇文章主要介绍了Mybatis-Plus自定义集合类型的类型处理器详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • MapStruct处理Java中实体与模型间不匹配属性转换的方法

    MapStruct处理Java中实体与模型间不匹配属性转换的方法

    今天小编就为大家分享一篇关于MapStruct处理Java中实体与模型间不匹配属性转换的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot加载静态资源的方式

    SpringBoot加载静态资源的方式

    本篇文章主要介绍了SpringBoot加载静态资源的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • IDEA启动tomcat项目报错53820 socket closed问题及解决

    IDEA启动tomcat项目报错53820 socket closed问题及解决

    IDEA启动Tomcat项目时报错,原因是IDEA关闭时Tomcat未正常关闭,导致端口被占用,解决方法是通过任务管理器关闭占用高内存的Java进程,通常是IDEA进程下面的,或者使用命令行找到PID并强制终止进程
    2024-12-12
  • SpringBoot静态资源CSS等修改后再运行无效的解决

    SpringBoot静态资源CSS等修改后再运行无效的解决

    这篇文章主要介绍了SpringBoot静态资源CSS等修改后再运行无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring boot随机端口你都不会还怎么动态扩容

    Spring boot随机端口你都不会还怎么动态扩容

    这篇文章主要介绍了Spring boot随机端口你都不会还怎么动态扩容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • mybatis和mybatisplus批量插入问题示例详解

    mybatis和mybatisplus批量插入问题示例详解

    最近在处理一个功能的时候,需要批量插入数据,这篇文章主要给大家介绍了关于mybatis和mybatisplus批量插入问题的相关资料,文中通过实例代码介绍非常详细,需要的朋友可以参考下
    2023-04-04
  • Java后端学习精华之TCP通信传输协议详解

    Java后端学习精华之TCP通信传输协议详解

    TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层
    2021-09-09

最新评论