Lombok你不知道的用法

news2024/11/24 9:39:52

Lombok是大家经常用的一款工具,它可以帮我们减少很多重复代码的书写,但是我们对它的使用,可能更多局限于实体类的编写,比如说通过@Data注解实现减少getter/setter/toString等方法的编写,其实它还有更多的注解功能,让我们一起来了解Lombok更多的注解吧!

1. IDEA中的安装

IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 安装成功
如下图:
在这里插入图片描述

2. 依赖的引入

在项目中添加Lombok依赖jar,在pom文件中添加如下,版本可以自己去Maven仓库找:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>

3. Lombok常用注解

@Setter
@Getter
@Data
@Log(泛型注解,具体有很多种形式)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@NonNull
@Cleanup
@ToString
@RequiredArgsConstructor
@Value
@SneakyThrows
@Synchronized

4. 注解详情

4.1 log

注解在 类 上。有如下可选择可用:

//@CommonsLog 等价于
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
//@JBossLog 等价于
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
//@Log 等价于
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
//@Log4j 等价于
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
//@Log4j2 等价于
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
//@Slf4j 等价于
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
//@XSlf4j 等价于
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

最常用的是@Slf4j注解,主要看你要引用哪个日志框架,不同的注解,引用的日志框架不同。自己根据情况选择。

4.2 @Getter和@Setter

该注解使用在类或者属性上,生成的getter遵循布尔属性的约定。例如:boolean类型的sex,getter方法为isSex而不是getSex。
在使用该注解时,会默认生成一个无参构造。和对应的getterhe setter方法,如下图,二者是等价的:
在这里插入图片描述
该注解也可以使用在单个属性上,会默认生成一个无参构造:
在这里插入图片描述

4.3 @Data

该注解使用在类上,是最常用的注解,它是@ToString,@EqualsAndHashCode, @Getter和@Setter的结合。本质上使用@Data注解,类默认@ToString和@EqualsAndHashCode以及每个字段都有@Setter和@getter。同时也会生成一个公共构造函数,可以将所有字段作为参数。

4.4 @NonNull

该注解使用在属性上,用于非空检查,当放在setter方法的字段上,将生成一个空检查,如果为空,则抛出NullPointerException。 该注解会默认是生成一个无参构造。

4.5 @toString

该注解使用在类上,该注解默认生成任何非讲台字段以名称-值的形式输出。
参数:

  • includeFieldNames:是否包含属性名称。
  • exclude:排除指定字段
  • callSuper:输出父类属性

注意:父类也要有toString方法,不然打印的是对象内存地址

4.6 @EqualsAndHashCode

该注解使用在类上,该注解在类级别注释会同时生成equals和hashCode。
存在继承关系需要设置callSuper参数为true。

4.7 @AllArgsConstructor

该注解使用在类上,该注解提供一个全参数的构造方法,默认不提供无参构造

4.8 @NoArgsConstructor

该注解使用在类上,该注解提供一个无参构造。

4.9 @RequiredArgsConstructor

该注解使用在类上,使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法。

4.10 @Value

这个注解用在 类 上,会生成含所有参数的构造方法,get 方法,此外还提供了equals、hashCode、toString 方法。 注意:没有setter

4.11 @Cleanup

该注解使用在属性前,该注解是用来保证分配的资源被释放。在本地变量上使用该注解,任何后续代码都将封装在try/finally中,确保当前作用于中的资源被释放。默认@Cleanup清理的方法为close,可以使用value指定不同的方法名称,例如 @Cleanup("clean")
如下:
不使用之前:

try {
	// to do something
}finally {
    if (in != null) {
        in.close();
    }
}
public class CleanupExample {
    public static void main(String[] args) throws IOException {

        try(InputStream inputStream =
                    new FileInputStream(".\\src\\main\\java\\com\\cauchy6317\\common\\Cleanup\\ForCleanupExample.txt")){
            // to do something
        }
        @Cleanup Reader fileReader =
                new FileReader(".\\src\\main\\java\\com\\cauchy6317\\common\\Cleanup\\ForCleanupExample1.txt");
        // to do something

    }
}

4.12 @Synchronized

在方法上使用synchronized 关键字可能会导致不幸的后果。如果是实例方法,则synchronized 关键字将锁定当前对象(此对象);对于静态方法,该关键字将锁定该类对象。 这意味着开发人员无法控制代码锁定同一对象,从而导致死锁。 通常建议改为显式地锁定在专用于该目的的单独对象上,并且不要以允许未经请求的锁定的方式公开。

该注解使用在类或者实例方法上。该注解用在类方法或者实例方法上,效果和 synchronized 关键字相同,区别在于锁对象不同。对于类方法和实例方法,它俩区别在于:

  • synchronized 关键字的锁对象分别是“类的 class 对象”和“this 对象”
  • @Synchronized 的锁对象分别是“私有静态 final 对象 lock”和“私有 final 对象 lock”。当然,也可以自己指定锁对象。

用@Synchronized注释实例方法将提示Lombok生成一个名为$lock的私有锁定字段,该方法将在执行之前在该字段上锁定。 类似地,以相同的方式注释静态方法将生成一个名为$lock的私有静态对象,以供静态方法以相同方式使用。 可以通过为注释的value参数提供字段名称来指定其他锁定对象。 提供字段名称时,开发人员必须定义属性,因为Lombok不会生成该属性。

使用如下:

    private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
     
    @Synchronized
    public String synchronizedFormat(Date date) {
        return format.format(date);
    }

等价于:

 private final java.lang.Object $lock = new java.lang.Object[0];
 private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
     
    public String synchronizedFormat(Date date) {
        synchronized ($lock) {
            return format.format(date);
        }
    }

4.13 @SneakyThrows

该注解使用在方法上,这个注解用在方法上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用Lombok.sneakyThrow(e) 把异常抛出,可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。该注解需要谨慎使用

在这里插入图片描述

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

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

相关文章

美依礼芽破圈!小红书数据解读,如何拨动二次元心弦?

今年&#xff0c;二次元存在感爆棚。新世代下二次元群体愈发壮大&#xff0c;不少博主发布二次元内容、品牌也试图融入二次元圈。那么&#xff0c;如何与之打成一片呢&#xff1f;今天&#xff0c;通过小红书数据&#xff0c;我们来解读二次元的内容方向。 点赞破8亿&#xff0…

【每日一题】1595. 连通两组点的最小成本

【每日一题】1595. 连通两组点的最小成本 1595. 连通两组点的最小成本题目描述解题思路 1595. 连通两组点的最小成本 题目描述 给你两组点&#xff0c;其中第一组中有 size1 个点&#xff0c;第二组中有 size2 个点&#xff0c;且 size1 > size2 。 任意两点间的连接成本…

对象的构造

问题 对象中成员变量的初始值是多少&#xff1f; 成员变量的初始值 #include <stdio.h>class Test { private:int i;int j; public:int getI() { return i; }int getJ() { return j; } };Test gt;int main() {printf("gt.i %d\n", gt.getI());printf("…

UE中使用Editor Utility Widget创建编辑器工具

在UE中可以使用EditorUtilityWidget创建编辑器面板工具&#xff0c;方便平时的开发。在UE4中使用编辑器UI需要开启对应插件&#xff0c;而UE5中则默认启用&#xff0c;下面就来学习一下。 1.UI创建 1.1.在Content Browser中右键&#xff0c;找到Editor Utilities即可创建编辑…

[MySQL]不允许你不会SQL语句之查询语句

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

分享几个AI绘图的学习网址

AI绘图是一种使用人工智能技术来创建图形和图像的技术。 从技术角度来看&#xff0c;AI绘图是一个非常有趣和不断发展的领域。随着人工智能技术的不断进步&#xff0c;AI绘图也在不断地发展和创新&#xff0c;现在已经成为数字艺术领域中的一个重要分支。 AI绘图的出现也为许多…

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术 有了前面的知识之后&#xff0c;想必大家对于算力需求的理解已经越来越深刻了。 除了使用CPU&#xff0c;GPU这样的通用器件之外&#xff0c;采用专用的硬件来进行加速是一个大家都能想到的选择。 其中的代表器件就是…

Docke是什么,一文带你了解

Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解 随着云计算和容器化技术的发展&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;受到了越来越多的关注和应用。本文将详细介绍Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作…

memcpy 和 memmove的模拟实现

文章目录 1.函数的介绍 2.模拟实现 文章内容 1.函数的介绍 memcpy指的是C和C使用的内存拷贝函数&#xff0c;函数原型为void *memcpy(void*dest,void*src, size_t count)&#xff1b;函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中&#xff0c;即从…

内网穿透(NAT 穿透)原理+工具(部分无需管理员权限)

内网穿透&#xff0c;即 NAT&#xff08;Network Address Translation&#xff09; 穿透 内网穿透的实质是内网映射&#xff0c;内网地址转换成外网地址的实现。实现过程要有端对端数据传输&#xff0c;也有端口转发原理。内网映射方式&#xff0c;可以解决无公网IP问题&#…

Android问题笔记-Android studio 出现Failed to compile values file.错误

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

docker compose 容器编排工具

目录 docker compose是什么&#xff1f; 官网网站&#xff1a;Docker Compose overview | Docker Documentation 安装使用compose&#xff1a; 步骤&#xff1a; 1、下载并安装compose的命令行插件 2、安装完成后授予权限&#xff0c;测试compose是否可以使用 3、实例测试…

AI大模型迈入应用时代,每日互动推动“可控大模型”落地

垂直行业更需要可控大模型 当下&#xff0c;大模型正在不断精进&#xff0c;以GPT-4、文心一言为代表的大模型&#xff08;LLM&#xff09;表现出了强大的逻辑推理能力&#xff0c;并能够很好地处理复杂任务&#xff0c;使得社会生产力得到了飞跃式提升。 面对大模型热度的持…

全网最详细,自动化测试与自动化框架总结,你不知道的都在这了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 单元测试框架 单…

网络:IP地址、子网掩码、网络地址、广播地址、网段、网关

目录 一、IP地址 二、子网掩码 三、网络地址 四、广播地址 五、网段 六、网关 七、IP地址、子网掩码、网络地址、广指地址、网殷、网关的关系 参考链接 一、IP地址 IP地址是因特网协议&#xff08;IP&#xff09;中使用的一种数字标识符&#xff0c;用于唯一地标识网络…

LLM - 基于 Vicuna-13B 参数计算搭建私有 ChatGPT 在线聊天

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131312366 LLaMA 和 Vicuna 都是大语言模型(LLM)&#xff0c;两者的差异如下&#xff1a; LLaMA (Large Language Model Meta AI)&#…

英飞凌MCU芯片选型推荐参考

前言: 英飞凌Infineon作为一家芯片大厂,有众多芯片产品可供选型,这里重点推荐下庞大的MCU系列如何选项。首先,对于英飞凌产品构成要有深刻的认识,需要熟悉一个半导体产业并购的历程。2013年5月,Spansion 1.1亿美元并购了对富士通(Fujitsu)半导体微控制器和模拟业务部门…

聚类Clustering方法定位船舶站点

背景 现有船舶的航线中采样的数据库&#xff0c;采样的总时长为3个月&#xff0c;仅采样航速静止&#xff08;小于1节&#xff09;的数据&#xff0c;关键有效数据主要有经纬度/实时吃水量。 思路 基于站点附近轮船有停靠且航行速度慢&#xff0c;故取样点多的基础认识&…

正确的认识泥石流以及做好泥石流的防范

泥石流是山区沟谷中由暴雨、冰雪融水或地下含水层的渗入所形成的携带大量泥沙、石块等固体物质的特殊洪流&#xff0c;具有流量大、历时短、破坏力强等特征&#xff0c;泥石流携带的泥沙、石块等可高达数十米&#xff0c;并从山坡上倾泻而下&#xff0c;往往会形成一个“堰塞湖…

Python自动化测试利器selenium详解

Selenium是一种常用的Web自动化测试工具&#xff0c;支持多种编程语言和多种浏览器&#xff0c;可以模拟用户的交互行为&#xff0c;自动化地执行测试用例和生成测试报告。Selenium基于浏览器驱动实现&#xff0c;结合多种定位元素的方法&#xff0c;可以实现各种复杂的Web应用…