Lombok 高级说明

优质博文:IT-BLOG-CN
在这里插入图片描述

一、痛点

【1】代码臃肿:POJO中的getter/setter/equals/hashcode/toString等;
【2】样板式代码:I/O流的关闭操作等;

Lombok是一个可以通过注解简化Java代码开发的工具,能够在我们编译源码的时候自动帮我们生成代码,如getter/setter/hashcode等;

官网

GitHub

二、Lombok 缺点

【1】反射: Lombok注解处理器在编译期间会生成一些代码,其中包括gettersetter方法、构造函数等。这些代码在运行时可以通过反射来访问和调用。使用反射会带来性能问题:反射调用方法的性能通常比直接调用方法要慢得多,因为反射需要进行额外的操作来查找和调用方法。安全问题:反射可以访问和调用私有方法和字段,这可能会导致安全问题。可维护性问题:由于反射调用方法的代码通常比直接调用方法的代码更加复杂,因此可能会导致代码难以理解和维护。
【2】影响升级: Lombok对于代码有很强的侵入性,就可能带来一个比较大的问题,那就是会影响我们对JDK的升级。如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。因为一个应用可能依赖了多个jar包,而每个jar包可能又要依赖不同版本的Lombok,这就导致在应用中需要做版本仲裁,而我们知道,jar包版本仲裁是没那么容易的,而且发生问题的概率也很高。
【3】隐藏的问题: 在使用Lombok过程中,如果对于各种注解的底层原理不理解的话,很容易产生意想不到的结果。举个例子,当我们使用@Data定义一个类的时候,会自动帮我们生成equals()方法。但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认是@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。所以我们使用工具时,就应该对这个工具有一定了解,不然就变成黑盒了,上线很容易出问题。
【4】代码可读性和可调试性降低: 大量使用Lombok,例如想要知道某个类中的某个属性的getter方法都被哪些类引用的话,就没那么简单了。这种说法其实也是不对的,通过IDEA可以很方便的找到某个属性的getter方法都被哪些类引用。
【5】必须安装第三方插件: 如果未安装插件,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。所以只要你负责的项目使用了Lombok,就必须安装插件。这点我觉得不是最不能接受的,安装一个插件也不会很费事。
【6】破坏抽象: 如果我们在代码中直接使用Lombok,那么他会自动帮我们生成gettersetter等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。外部可以通过setter方法随意地修改属性的值。而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的setter方法,明显违反了面向对象的封装特性。

三、使用

【1】引入POM依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>

【2】安装插件:Perferences->Plugins->Search Lombok plugin->Install,同时勾选Preferences->Compiler->Annotation Processors->Enable annotation processing
【3】常见注解:

@Data // 包含了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的功能
@Getter // 生成的get方法是publish
@Getter(lazy = true) // 标注字段为懒加载字段,懒加载字段在创建对象时不会进行初始化,而是在第一次访问的时候才会初始化,后面再次访问也不会重复初始化
@Getter(AccessLevel.PROTECTED) // 生成的get方法是protected
@Setter
@NoArgsConstructor // 生成无参构造器,当有final字段没有被初始化时,编译器会报错。使用@NoArgsConstructor(force = true)时,没有初始化final字段设置默认值 0 / false / null, 这样编译器就不会报错。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
@AllArgsConstructor // 所有参数构造器
@RequiredArgsConstructor // 生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。
@RequiredArgsConstructor(staticName = "of") // 会生成一个of()的静态方法,并把构造方法设置为私有的
@NonNull // setter方法执行时,如果传入的参数为Null时,会抛出NPE
@ToString // 生成toString()方法,默认情况下它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段,可以指定一个也可以指定多个@ToString(exclude = "id") / @ToString(exclude = {"id","name"})。如果继承的有父类的话,可以设置callSuper让其调用父类的toString()方法,例如:@ToString(callSuper = true)
@EqualsAndHashCode // 生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在of参数中命名它们来准确指定希望使用哪些字段。
@Value // 将字段都变成不可变类型:使用final修饰, 同时还包含@ToString、@EqualsAndHashCode、@AllArgsConstructor 、@Getter(注意只有Getter没有Setter)
@Log // 生成log对象,用于记录日志,可以通过topic属性来设置getLogger(String name)方法的参数 例如 @Log4j(topic = “com.xxx.entity.User”),默认是类的全限定名,即 类名.class,log支持以下几种:@Log java.util.logging.Logger;@Log4j org.apache.log4j.Logger;@Log4j2 org.apache.logging.log4j.Logger;@Slf4j org.slf4j.Logger;@XSlf4j org.slf4j.ext.XLogger;@CommonsLog org.apache.commons.logging.Log;@JBossLog org.jboss.logging.Logger
@SneakyThrows // 替代 try{}catch(Exception e){}这样的模板代码: @SneakyThrows(InterruptedException.class) 使用在方法上面。
@Synchronized // 给方法加上同步锁。
@Cleanup // 用来修饰 IO 流相关类, 会在 finally 代码块中对该资源进行 close();  举例:@Cleanup InputStream in = new FileInputStream(args[0])
@Wither // 提供了给final字段赋值的一种方法
@Builder // 为你的类生成复杂的构建器API。
@Delegate // 为List类型的字段生成一大堆常用的方法,其实这些方法都是List中的方法

四 lombok config 文件

lombok.config配置文件是通过一些设置来控制代码生成的规则或者称之为习惯,配置文件的位置应放在src/mian/java,不要放置在src/main/resources。配置文件和要使用注解的类要在同一套代码中,要么同时在src/main/java要么同时在src/test/java中。

#lombok 默认对boolean类型字段生成的get方法使用is前缀,通过配置则使用get前缀,默认 false
lombok.getter.noIsPrefix=true
#默认的set方法返回void设置为true返回调用对象本身,这样方便使用链式来继续调用方法,默认:false
lombok.accessors.chain=true
#如果设置为true,get和set方法将不带get和set前缀,直接以字段名为方法名,默认false
lombok.accessors.fluent=true
#设置log类注解返回的字段名称,默认 log
lombok.log.fieldName=logger

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676391.shtml

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

相关文章

个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程

个体诊所门诊电子处方开单管理系统软件&#xff0c;配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明&#xff0c;最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中&#xff0c;医师开单可谓是争分夺秒&…

ArcGIS学习(四)坐标系-1

ArcGIS学习(四)坐标系 大家平时在处理数据的时候肯定经常遇到坐标系相关的问题。最常见的就是同一个地区的两个数据,导入ArcGIS内却对不上;也肯定听到过坐标系相关的一些词语,比如地理坐标系投影坐标系、投影、WGS1984坐标、CGCS2000坐标系、火星坐标系、百度坐标系等。 …

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家&#xff01;&#xff01;&#xff01; 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;其已经被集成在re…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

统一数据格式返回,统一异常处理

目录 1.统一数据格式返回 2.统一异常处理 3.接口返回String类型问题 1.统一数据格式返回 添加ControllerAdvice注解实现ResponseBodyAdvice接口重写supports方法&#xff0c;beforeBodyWrite方法 /*** 统一数据格式返回的保底类 对于一些非对象的数据的再统一 即非对象的封…

Verilog刷题笔记28

题目&#xff1a; A “population count” circuit counts the number of 1’s in an input vector. Build a population count circuit for a 255-bit input vector. 解题&#xff1a; module top_module( input [254:0] in,output [7:0] out );int i;always(*)beginout8b0;…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书添加模块-图书类别ComboBox下拉框初始化数据实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何手机搜大学生答案? #笔记#微信

今天我就分享几款搜题软件和搜题网站给大家&#xff0c;每一款都能轻松搜索题目&#xff0c;让大家快速找到精准的答案&#xff0c;有需要的小伙伴快点赞收藏起来&#xff0c;防止需要的时候找不到啦。 1.试题猪 这个是公众号 涵盖初大学&#xff0f;专升本&#xff0f;考研…

完美运营的最新视频打赏系统及附带教程

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 优于市面上95%的打赏系统,与其他打赏系统相比,功能更加强大,完美运营且无bug。支付会调、短链接生成、代理后台、价…

LeetCode1365之切披萨的方案数(相关话题:二维前缀和,动态规划)

题目描述 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A &#xff08;表示苹果&#xff09;和 . &#xff08;表示空白格子&#xff09;。你需要切披萨 k-1 次&#xff0c;得到 k 块披萨并送给别人。 切披萨的每一刀&#xf…

vscode开发FPGA(0)--windows平台搭建

一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese&#xff08;simplified&#xff09;中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…

MySQL篇之定位与优化MySQL慢查询

一、如何定位慢查询 1.方案一&#xff1a;开源工具 调试工具&#xff1a;Arthas。 运维工具&#xff1a;Prometheus 、Skywalking。 2.方案二&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;…

Backtrader 文档学习- Plotting -Plotting on the same axis

Backtrader 文档学习- Plotting -Plotting on the same axis 1.概述 在同一轴上绘图&#xff0c;绘图是在同一空间上绘制原始数据和稍微(随机)修改的数据&#xff0c;但不是在同一轴上。 核心代码&#xff0c;data数据正负50点。 # The filter which changes the close pri…

力扣热门100题 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路&#xff1a;&#xff08;动态规划&#xff09;代码&#xff1a; 题目链接&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回…

[day0] 借着“ai春晚”开个场

1 文思ai笔记-新的开始 今天是2024年2月29日&#xff0c;也是传统农历的除夕夜。早起在ai圈看到一个比较新奇的消息&#xff0c;ai春晚今日举办&#xff0c;竟然有一点小小的激动。这些年确实好久没看过春晚了&#xff0c;自己对于春晚的映像还停留在“白云黑土”、“今天&…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十四章&#xff1a;使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…

【51单片机】烧写教程:将代码下载到单片机中(图示&解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 这是LCD基本实验中的一部分&#xff0c;完整实验传送门如下&#xff1a;传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是…

初始web服务器(并基于idea来实现无需下载的tomcat)

前言 前面学习了对应的http协议&#xff0c;我们知道了他是在网络层进行数据传输的协议&#xff0c;负责相应数据以及接收数据的规则&#xff0c;但是在人员开发后端的时候不仅仅需要你写io流进行数据传输&#xff0c;还需要你进行对应的tcp协议来进行数据打包发送http协议-CSD…

横扫Spark之 - 22个常见的转换算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. map()2. flatMap()3. filter()4. mapPartitions()5. mapPartitionsWithIndex()6. groupBy()7. distinct()8. coalesce()9. repartition()10. sortBy()11. intersection()12.union()13.…

IT行业有哪些证书含金量高呢?

目录 引言&#xff1a; 一、 计算机网络类证书 二、 数据库管理类证书 三、 安全与信息技术管理类证书 四、 编程与开发类证书 五、 数据科学与人工智能类证书 六、结论&#xff1a; 悟已往之不谏&#xff0c;知来者犹可追 …