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.rhkb.cn/news/435999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程替换

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 进程程序替换 代码和现象 替换函数 替换原理 函数解释 命名理解 简易s…

视频美颜SDK与直播美颜工具API是什么?计算机视觉技术详解

今天,小编将深入探讨视频美颜SDK与直播美颜工具API的概念及其背后的计算机视觉技术。 一、视频美颜SDK的概念 视频美颜SDK是一套用于开发实时美颜效果的工具集,开发者可以利用它在视频流中实现面部特征的优化。这些SDK通常提供了一系列功能&#xff0c…

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

SpringBoot3脚手架

MySpringBootAPI SpringBoot3脚手架&#xff0c;基于SpringBoot3DruidPgSQLMyBatisPlus13FastJSON2Lombok&#xff0c;启动web容器为Undertow(非默认tomcat)&#xff0c;其他的请自行添加和配置。 <java.version>17</java.version> <springboot.version>3.3…

fastAPI教程:jinja2模板

FastAPI 五、jinja2模板 jinja是python知名web框架Flask的作者开发的⼀个开源的模板系统&#xff0c;起初是仿django模板的⼀个模板引擎DjangoTPL&#xff0c;为Flask提供模板支持&#xff0c;由于其灵活&#xff0c;快速和安全等优点被⼴泛使用。 jinja2是jinja2这个模块的…

erlang学习:Linux命令学习8

shell脚本案例学习 循环求 1-100 的每一步和 —案例 j0 i1 while((i<100)) do j$((ji)) echo $j ((i)) done每 30 s循环判断一次 user 用户是否登录系统 —案例 设置了一个次数&#xff0c;如果循环了五次在user文件中添加user用户&#xff0c;表示用户登录 USERS"u…

nodejs安装及环境配置

一、下载 进入官网https://nodejs.org/en/download/prebuilt-installer下载node.js安装包&#xff0c;选择对应版本的node&#xff0c;这里我选择的是14.21.3版本 二、安装 1、下载完成后&#xff0c;双击“node-v14.21.3-x64.msi”&#xff0c;开始安装Node.js 2、勾选复…

【电机-概述及分类】

文章目录 第1章1-1 电机的定义1-2 电机的构成要素1-3 电机的分类1-3-1 直流电机1-3-1-1 永磁励磁型直流电机1-3-1-2 电磁铁励磁型直流电机 第1章 重新认识电机的体系 电机包括许多种类。换个角度来看&#xff0c;并没有完美的电机&#xff0c;某种电机具有所谓A的优点&#xf…

STM32F1+HAL库+FreeTOTS学习14——数值信号量

STM32F1HAL库FreeTOTS学习13——数值信号量 1. 数值信号量2. 相关API函数2.1 创建计数信号量2.2 获取信号量2.3 释放信号量2.4 删除信号量2.5 获取信号量的计数值 3. 操作实验1. 实验内容2. 代码实现&#xff1a;运行结果 上一期我们学习了二值信号量 &#xff0c;这一期学习计…

在线相亲系统:新时代的婚恋观与传统习俗的碰撞

随着互联网技术的发展&#xff0c;相亲交友平台已成为年轻人寻找伴侣的新方式。这些平台不仅改变了人们的社交习惯&#xff0c;也反映了当代婚恋观与传统习俗之间的碰撞与融合。开发h17711347205本文将探讨在线相亲系统是如何在尊重传统的基础上&#xff0c;为现代年轻人提供更…

21.1 k8s接口鉴权token认证和prometheus的实现

本节重点介绍 : k8s接口鉴权方式serviceaccount和token的关系手动curl访问metrics接口 k8s对象接口鉴权 以容器基础资源指标为例 对应就是访问node上的kubelet的/metrics/cadvisor接口&#xff0c;即访问https://nodeip:10250/metrics/cadvisor 直接curl访问 会报错&…

第一弹:llama.cpp编译

1.编译llama.cpp命令行&#xff08;电脑版本&#xff09;&#xff1b; 2.交叉编译安卓命令行版本。 一、Llama.cpp是什么&#xff1f; 二、Llama.cpp编译 首先我们尝试编译llama.cpp. 2.1 下载llama.cpp 项目的github地址&#xff1a; https://github.com/ggerganov/llama…

ubuntu18.04 NVIDIA驱动 CUDA cudnn Anaconda安装

1、安装NVIDIA驱动 a.查看推荐驱动 ubuntu-drivers devicesb.打开软件更新&#xff0c;选择相应的显卡 c.重启查看安装情况&#xff0c;输入nvidia-smi 2、安装CUDA 下载链接https://developer.nvidia.com/cuda-toolkit-archive 安装CUDA&#xff1a; sudo bash cuda_11…

完整网络模型训练(一)

文章目录 一、网络模型的搭建二、网络模型正确性检验三、创建网络函数 一、网络模型的搭建 以CIFAR10数据集作为训练例子 准备数据集&#xff1a; #因为CIFAR10是属于PRL的数据集&#xff0c;所以需要转化成tensor数据集 train_data torchvision.datasets.CIFAR10(root&quo…

前端工程规范-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具&#xff0c;它们结合起来可以提供以下作用和优势&#xff1a; 代码格式化和风格统一&#xff1a; Prettier 是一个代码格式化工具&#xff0c;能够自动化地处理代码的缩进、空格、换行等格式问题&#xff0c;…

【C++算法】8.双指针_三数之和

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 15.三数之和 题目描述&#xff1a; 解法 解法一&#xff1a;排序暴力枚举利用set去重O(n3) 例如nums[-1&#xff0c;0&#xff0c;1&#xff0c;2&#xff0c;-1&…

【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

文章目录 C模板进阶编程前言第一章: 非类型模板参数1.1 什么是非类型模板参数&#xff1f;1.1.1 非类型模板参数的定义 1.2 非类型模板参数的注意事项1.3 非类型模板参数的使用场景示例&#xff1a;静态数组的实现 第二章: 模板的特化2.1 什么是模板特化&#xff1f;2.1.1 模板…

基于单片机的催眠电路控制系统

** 文章目录 前言一 概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主…

Apache DolphinScheduler-1.3.9源码分析(一)

引言 随着大数据的发展&#xff0c;任务调度系统成为了数据处理和管理中至关重要的部分。Apache DolphinScheduler 是一款优秀的开源分布式工作流调度平台&#xff0c;在大数据场景中得到广泛应用。 在本文中&#xff0c;我们将对 Apache DolphinScheduler 1.3.9 版本的源码进…

html+css(如何用css做出京东页面,静态版)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>京东</title><link rel"stylesheet&q…