当前位置: 首页 > article >正文

Lombok同时使⽤@Data和@Builder遇到的坑

Lombok同时使⽤@Data和@Builder遇到的坑

  • Lombok是什么
  • 有什么问题
    • 不使用任何注解
    • 只使用@Data注解
    • 只使用@Builder注解
    • 同时使用@Data和@Builder注解
  • 如何解决
    • @Builder和@NoArgsConstructor冲突
    • 使用@AllArgsConstructor

Lombok是什么

Lombok 是一个 Java 库,它通过注解的方式帮助开发者减少在 Java 开发过程中的一些冗余代码,比如 getter、setter、equals、hashCode、toString 等方法的编写。使用 Lombok 可以让代码更加简洁和清晰。以下是一些常用的 Lombok 注解及其作用:

  • @Data:为类添加 getter、setter、equals、hashCode 和 toString 方法。
  • @AllArgsConstructor:为类中的所有字段生成构造器。
  • @NoArgsConstructor:为类生成一个无参构造器。
  • @ToString:生成 toString 方法。
  • @EqualsAndHashCode:生成 equals 和 hashCode 方法。
  • @Getter / @Setter:分别为类的所有字段生成 getter 和 setter 方法。也可以用在单个字段上。
  • @NonNull:标记一个字段,在生成的 equals 方法中会检查该字段是否为 null。
  • @Builder:生成一个构建器,用于创建类的实例,这个构建器支持按需设置类中的字段,使得对象的创建更加灵活。

有什么问题

好用是真的好用,但是遇到问题时也是真的让人懵,就比如 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过 这样的问题,下面我们来看下造成这种问题的原因。

不使用任何注解

如下我们创建一个bean,不适用任何 Lombok 注解:

public class TestBean {
    private Integer id;
    private String  name;
}

看一下编译之后的class文件如下图所示,即使是我们没用显示定义构造方法,Java编译器还是自动为我们生成了无参构造方法,这样的类才能通过构造函数创建对象。

编译

但是想使用这个类,还是需要手动添加 get 和 set 方法才能设置属性值。

手动添加get和set

只使用@Data注解

当我们给 TestBean 类添加了 @Data 注解之后,再看下编译之后的 class 文件,Lombok 已经替我们添加了更多的方法如 toString()hashCode()equals() 等,我们可以正常使用 new 个对象,设置属性。

只使用@Data编译

只使用@Builder注解

当我们给bean添加 @Builder 注解时,Lombok 替我们添加了如下内容:

  • 默认访问权限的构造方法,是个全参构造函数,只能同一包内的类进行访问;
  • builder() 方法,返回一个TestBeanBuilder对象,是链式调用的关键;
  • TestBeanBuilder类,内部封装了链式调用的各种方法设置属性值,并借助 build() 方法调用全参构造函数创建bean。

只使用@Builder编译

其他包要使用这个类只能通过 builder() 方法来生成一个可链式调用的对象进行属性的定义,这也是建造者模式(Builder Pattern) 的一种便捷方式。

建造者模式是一种设计模式,用于解决对象创建时参数过多的问题,尤其是当对象有很多可选参数时。Lombok 的 @Builder 注解简化了建造者模式的实现,使得代码更加简洁和易读。

包外无法使用构造函数

正确创建对象流程

同时使用@Data和@Builder注解

当我们同时使用 @Data@Builder 注解的时候,由于 Lombok 给我们默认生成了默认访问权限的全参构造函数,此时 Java 编译器就不会给我们提供默认的无参构造函数,所以我们还是只能使用链式调用的方式创建对接,调用无参构造函数时会报错。

同时使用@Data和@Builder编译

如何解决

只能通过添加构造函数来创建对对象了,可以通过手动编写,也可以同注解的方式生成构造函数。

@Builder和@NoArgsConstructor冲突

当同时给类添加@Builder和@NoArgsConstructor注解时,会出现编译失败的问题,这是因为 Lombok 的 @Builder 注解需要一个合适的构造方法来生成构建器,而 @Builder@NoArgsConstructor 注解在一起使用时,Lombok 无法自动生成合适的构造函数供 @Builder 使用。 @Builder 注解需要有一个全参构造函数,而 @NoArgsConstructor 注解会生成一个无参构造函数,导致冲突。

@Builder和@NoArgsConstructor冲突

使用@AllArgsConstructor

因为 @Builder 需要一个全参构造函数,可以使用 @AllArgsConstructor 来生成一个全参构造函数,配合 @Builder 使用:

使用@AllArgsConstructor


http://www.kler.cn/news/327191.html

相关文章:

  • 0基础学习PyTorch——监控机器学习的可视化工具
  • PostgreSQL 字段使用pglz压缩测试
  • OceanBase企业级分布式关系数据库
  • TypeScript 算法手册 - 【冒泡排序】
  • 海陆钻井自动化作业机器人比例阀放大器
  • Apache Solr:深入探索与常见误区解析
  • 深度学习实战:UNet模型的训练与测试详解
  • 关于 JVM 个人 NOTE
  • ARM Assembly: 第8课 branching
  • Web自动化中常用XPath定位方式
  • D23【 python 接口自动化学习】- python 基础之判断与循环
  • Docker入门指南:快速学习Docker的基本操作
  • 网络编程(13)——单例模式
  • BCJR算法——卷积码的最大后验译码
  • Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等
  • 联邦学习(三只决策和大数据分析)(学习笔记)
  • 【网络安全】TCP和UDP
  • 防止电脑电池老化,禁止usb或者ac接口调试时充电
  • 计算神经学笔记01
  • 后端-对表格数据进行添加、删除和修改
  • 单片机的原理及应用
  • 2024年华为OD机试真题-找终点-Java-OD统一考试(E卷)
  • AIGC学习笔记—minimind详解+训练+推理
  • elasticsearch单个node节点写入数据
  • 中间层架构设计:构建稳健的企业级服务
  • [Day 81] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 表现层架构设计:打造高效、可维护的前端系统
  • JavaScript网页设计案例深度解析:从理论到实践
  • frps+nginx实现访问ip的记录
  • 测试用例_边界值介绍(需求自动化生成用例方法论)