Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!

AI 大模型在电商精准营销中的应用 例如,对于用户 A 和用户 B,通过比较他们对共同评价过的商品的评分差异来确定相似度。其中,(Gain(D,a))表示特征(a)对数据集(D)的信息增益,(Ent(D))表示数据集(D)的信息熵,(V)表示特征(a)的取值个数,(D^{v})表示特征(a)取值为(v)的样本子集。其中,(sim(A,B))表示用户 A 和用户 B 的相似度,(I)表示用户 A 和用户 B 共同评价过的商品集合,(R_{A,i})和(R_{B,i})分别表示用户 A 和用户 B 对商品(i)的评分。(三)营销活动效果预测。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.cn/post/

7103011031672176677

206e5b86acf923a016ee77e76f728b03.jpeg


问题背景

Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过。如下图:

906e3c712727f5207f21216aa05c19b9.jpeg

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

Lombok @Data和@Builder分别单独分析用法

Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法。可以简化我们代码的开发。(需要安装Lombok插件和引⼊Lombok依赖)。

例如下⾯的⼀个实体类,引⼊Lombok后,可以⾃动⽣成GET/SET⽅法和⽆参构造函数。

bd7f40cbdb6ca846fc1406184df7f20e.jpeg编译后的class为:可以看到不仅帮我们生成了get和set ,同时也有默认的无参构造器

20e743834aab8c9e1cef03a891aaabf4.jpeg

那么怎么自动生成有参构造器呢?使用@Builder注解,将会帮助我们⽣成全属性的构造⽅法。

92f0b1f6a3f0f6c41f506a8c82d95386.jpeg

编译后的class为:可以看到 已经帮我们构建好了全属性的构造方法,但是如果值只引用@Builder注解是无法生成get和set的。

c368257b2d6b4ac9314136cb7d6bd084.jpeg

但是如果同时使⽤@Data和@Builder的话,可以看出尽管⽣成了GET/SET⽅法,但是⽆参构造⽅法没有了,这显然是不能接受的,因为很多框架都会调⽤⽆参构造去创建对象。

fb167f46d15d299e4e0bd79352254143.jpeg

编译后的class:d3697b1a41f902555bf2fda968c7d56b.jpeg

我们尝试在Tet1类,⼿动添加⽆参构造⽅法。编译发现报错不通过:

0f8fd29d4bed70c44f3e6ef3e9a1329b.jpeg

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

解决方法

方法一

Lombok同时使⽤@Data和@Builder的时候,如果要⽣成⽆参构造,需要在代码⾥⾯⼿动引⼊注解@Tolerate,让Lombok在⽣成类的时候,对指定的构造函数不感知。

364521567e0b156c59c8a34240c2c15b.jpeg

方法二

直接使用无参构造器+有参构造器的方式,@RequiredArgsConstructor 来构建有参,@NoArgsConstructor来构建无参构造器,如图所示:

32e54bf4d702960d5690e26f71a670a0.jpeg编译后效果:

d65817c563408501f7751dc309fdcef7.jpeg

Lombok原理

Java的编译分为以下⼏个阶段:

解析与填充符号表->注解处理->分析与字节码⽣成->⽣成⼆进制class⽂件。

  • Lombok 使⽤的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器),它是在编译期时把 Lombok 的注解代码,转换为常规的 Java ⽅法⽽实现注⼊。

  • 在编译期阶段,当 Java 源码被抽象成语法树 (AST) 之后,Lombok 会根据⾃⼰的注解处理器动态的修改AST,增加新的代码 (节点),在这⼀切执⾏之后,再通过分析⽣成了最终的字节码 (.class) ⽂件,这就是Lombok 的执⾏原理。

可以借助注解处理器实现⼀个简单的 Setter,我们的实现步骤是:

  • ⾃定义⼀个注解标签接⼝,并实现⼀个⾃定义的注解处理器;

  • 利⽤ tools.jar 的 javac api 处理 AST (抽象语法树)3. 使⽤⾃定义的注解处理器编译代码。

1.定义⾃定义注解和注解处理器

⾸先创建⼀个 MySetter.java ⾃定义⼀个注解,代码如下:

d3417da085082b50e342823eb5ad4f34.jpeg

再实现⼀个⾃定义的注解处理器,代码如下:

459145a19ba9c9dc8da191d0e28ad576.jpeg bcdb5b8e1fe42ed52d7493e50649417a.jpeg 9e306d58db0a22677b713ce9ffccb52f.jpeg

测试类如下:

b4c929cbbf6ac254aefdd68d3770d3f4.jpeg

2.对注解处理器进⾏编译,随后使⽤注解处理器对类进⾏编译

⾸先需要先对注解处理器进⾏编译(javac -cp ⽤于引⼊第三⽅jar包进⾏编译)

2895b52fb19e8caabdd0081dab77ff5f.jpeg

然后使⽤注解处理器对这个Person测试类进⾏编译:

这时候再看⽣成的Person.class,可以发现Setter⽅法已经⽣成了:

9d6f94a2465e2319a28cb66a3bc60982.jpeg e152a242f484db3925e31bd03dd38570.jpeg

总结

当然尽管测试类已经⽣成Setter⽅法,但是因为是在编译时期⽣成的,因此我们在开发的时候是没法直接调⽤Setter⽅法的,因此Lombok提供了插件机制,⽅便我们在开发的时候可以直接去调⽤Lombok的特性。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

846156919ae1ec641d79cc68e3e91856.png

已在知识星球更新源码解析如下:

b309b7c3255381bedef8a9dd5fd3e5cc.jpeg

4ac6ed6b45193f36c846dd5430f92b0c.jpeg

943b4404b5142184aaefe9df499db9c9.jpeg

baaea7f4aca83d8400338c42606bf858.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况 主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。 立即下载

相关推荐

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1005

@Data和@Builder注解解析

====================================================================== @Data 和 @Builder是使用 lombok过程中常用的两个注解, @Data:将一个普通类变成JavaBean,并自动生成相应属性的 Getter,Setter等方法; @Builder:用构造者模式,通过链式方法帮助我们生成对象。 ==============================================================

abc1641211976的博客 6776

ESP32—C3实现网页跳转

用户点击HTML页面中的按钮。浏览器根据按钮的href属性向服务器发送HTTP GET请求。服务器根据请求的URL调用相应的回调函数。服务器发送包含新页面HTML内容的HTTP响应。浏览器解析并显示新的HTML页面。这个过程对于用户来说是无缝的,看起来就像是直接从一个页面跳转到另一个页面。实际上,背后发生了HTTP请求和响应的过程。

qq_59527512的博客 1024

Java类的Builder应用以及使用@Data和@Builder高效应用Builder

⭐Java Builder模式:是Java设计模式之一,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。:使用lombok的@Data和@Builder注解构建Java类的Builder简洁高效,推荐实际应用。:手动编写Java类的Builder,能够全貌理解Builder模式,推荐试试。:Java类的Builder模式,最大好处就是构建对象时,可以灵活构建需要的属性。

Leoon123的博客 2710

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

激光雷达和相机联合标定(一)——ROS同步解包

qq_44703886的博客 4235

SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】

在SAP系统中,分类账(Ledger)是用于会计核算的核心概念,它允许企业根据不同的会计原则和货币进行财务记录。定义分类账是配置平行账(Parallel Accounting)的第一步。分类账的创建:通过事务代码OX18可以创建新的分类账。通常,一个SAP系统会有一个主分类账(如0L),它代表法定会计和实时传输至管理会计(CO)的账本。分类账属性:在创建分类账时,需要定义其属性,如会计年度变式、货币、会计原则等。这些属性将决定分类账的核算规则和适用性。

数字化2025 4619

Lombok原理和同时使⽤@Data和@Builder 的坑

往期热门文章:1、面试官 | Spring Boot 项目如何统一结果,统一异常,统一日志? 2、为什么不建议使用ON DUPLICATE KEY UPDATE? 3、Java8 Stream,过分丝滑! 4、8 种最坑SQL语法,工作中踩过吗? 5、Java 语言“坑爹” TOP 10问题背景Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!...

Java之间 277

【win10】win 10 电脑喇叭音频显示红叉的处理方法

目录 一、报错情况 二、“音频服务未运行”解决方法 三、“未插入扬声器或耳机”解决方法 一、报错情况 (1)当电脑的扬声器喇叭图标上带有红X符号,提示“音频服务未运行”时: (2)小喇叭上面有红叉,显示“未插入扬声器或耳机”时: 二、“音频服务未运行”解决方法 (1)开始菜单搜索“服务”: (2)没有启动的点击“启动”,已启动的点击“重新启动”: (3)继续,右...

顾三殇 —— 博客空间(软件测试) 17万+

Lombok中@Builder和@Data注解使用注意

Builder 使用设计模式中的创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。 在对应实体类上使用@Builder注解标注,可以初始化所需要的实例对象: User.builder() .id(1) .name("zhangsan") .age(15) .build(); @Data 注解的主要作用是提高代码的简洁,使用这个注解可以省

一路的博客 4813

基于FPGA的时间数字转换(TDC)设计(一:原理)

基于FPGA的时间数字转换(TDC)设计,此为第一篇

sdau2005的博客 5072

爬虫:一文掌握网站加密和混淆以及浏览器调试的技巧

面对加密和混淆技术的网站,传统的爬虫方法可能难以奏效。通过结合浏览器调试工具(如Puppeteer、Playwright)、代理工具(如Burp Suite、Fiddler)以及动态和静态分析技巧,可以深入理解网站的运行机制,绕过加密和混淆,实现有效的数据抓取。同时,务必注意合法合规,尊重目标网站的规则和用户的隐私,确保爬虫行为的正当性和可持续性。

数据知道的博客 9893

Lombok爱恨纠葛之@Data 和 @Builder 的巨坑,千万别乱用!

Lombok 使用注意事项

hjp2020的博客 1270

MATLAB与ROS联合仿真——控制类功能模块介绍

MATLAB与ROS联合仿真——控制类功能模块介绍

慕羽★的博客 2353

Lombok 同时使用 @Data 和 @Builder 的巨坑

我这边有个线上例子,当时是个订单回调系统,MQ 里推过来一个 JSON 字符串,反序列化成对象失败,结果导致下游业务没法处理,后面一查发现是 DTO 上面加了 @Data 和 @Builder?直到某一天,我们用 Jackson 反序列化这个对象的时候,出现了一堆谜之警告:“No suitable constructor found”,我一脸问号 😵 明明对象字段对得上,为什么就是构造不出来。但是说实话,太绕了。如果你用了 @Builder,那它会生成一个只接受所有字段的构造器,而且这个构造器默认是。

m0_73735578的博客 845

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

千万别乱用了!Lombok的@Data 和 @Builder 有巨坑!

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:Alibaba开源内网高并发编程手册.pdf问题背景Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过。如下图:图片Lombok @Data和@Builder分别单独分析用法Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法。可以简化我们代码的开发。...

emprere的博客 527

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Java内部类有坑,100%内存泄露!
下一篇: 火山引擎:ClickHouse增强计划之“多表关联查询”
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值