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

Lombok 常用注解

文章目录

    • 简介
    • MAVEN 依赖
    • 常用的注解
      • 1. @Data 注解 :
      • 2. @Setter 注解:
      • 3.@Getter 注解:
      • 4.@Log4j or @Slf4j 注解
      • 5.@NoArgsConstructor注解:
      • 6.@AllArgsConstructor注解:
      • 7.@RequiredArgsConstructor注解:
      • 8.@Builder注解:
      • 9.@Cleanup注解:
      • 10.@SneakyThrows 注解:
      • 11.@Accessors

简介

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。
在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。

MAVEN 依赖

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

常用的注解

1. @Data 注解 :

一般用在类上,提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString等方法;
相当于注解集合。效果等同于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor 效果同和这5个注解的效果

需要注意的是,这里不包括@NoArgsConstructor和@AllArgsConstructor
所以, 一般使用@Data时,要配合这两个注解一起使用

2. @Setter 注解:

一般用在属性上,为属性提供 set 方法, 用在再类上则表示当前类中所有属性都生成set方法;

3.@Getter 注解:

用在属性上,为属性提供 get 方法, 用在再类上表示当前类中所有属性都生成get方法;

4.@Log4j or @Slf4j 注解

用在类上,为类提供一个 属性名为log 的 log4j日志对象;

5.@NoArgsConstructor注解:

用在类上,为类提供一个无参的构造方法;

6.@AllArgsConstructor注解:

用在类上,为类提供一个全参的构造方法;

  • 通过 @AllArgsConstructor(access = AccessLevel.PROTECTED) , 可以指定构造器的访问权限
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class Demo{private String name;private int age;
}

编译后生成:

public class Demo {private String name;private int age;protected Demo(String name, int age) {this.name = name;this.age = age;}
}
  • @AllArgsConstructor(access = AccessLevel.PROTECTED, staticName = “test”)
@AllArgsConstructor(access = AccessLevel.PROTECTED, staticName = "test")
public class Demo{private final int finalVal = 10;private String name;private int age;
}

编译后 :

public class Demo {private String name;private int age;private Demo(String name, int age) {this.name = name;this.age = age;}protected static Demo test(String name, int age) {return new Demo(name, age);}
}

上面效果为:可以指定生成的构造器的访问权限。但是如果指定了一个静态方法,那么构造器会自动会被private,只通过静态方法对外提供访问,并且我们发现final的属性值,是不会放进构造函数里面的

7.@RequiredArgsConstructor注解:

用在类上,生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;
@RequiredArgsConstructor注解则会将类中所有带有@NonNull注解 / org.jetbrains.annotations.NotNull注解的或者带有final修饰的成员变量生成对应的构造方法
测试案例:

@RequiredArgsConstructor
public class Demo {@NonNullprivate final int finalVal;@NonNullprivate String name;@NonNullprivate int age;
}

编译后生成:

import lombok.NonNull;public class Demo {@NonNullprivate final int finalVal;@NonNullprivate String name;@NonNullprivate int age;public Demo(@NonNull int finalVal, @NonNull String name, @NonNull int age) {if (name == null) {throw new NullPointerException("name is marked non-null but is null");} else {this.finalVal = finalVal;this.name = name;this.age = age;}}
}

8.@Builder注解:

用在类上,自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了;

注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事;

9.@Cleanup注解:

可以用在 IO 流上,用于关闭并释放资源;
例如下面例子,每次IO流操作后要在finally中关闭流,释放资源:

public class CleanupExample {public static void main(String[] args) throws IOException {InputStream in = new FileInputStream(args[0]);try {OutputStream out = new FileOutputStream(args[1]);try {byte[] b = new byte[10000];while (true) {int r = in.read(b);if (r == -1) break;out.write(b, 0, r);}} finally {if (out != null) {out.close();}}} finally {if (in != null) {in.close();}}}
}

类似以上的一个IO流操作的方法使用lombok 的 @Cleanup 注解后可以简化成这样:

public class CleanupExample {public static void main(String[] args) throws IOException {@Cleanup InputStream in = new FileInputStream(args[0]);@Cleanup OutputStream out = new FileOutputStream(args[1]);byte[] b = new byte[10000];while (true) {int r = in.read(b);if (r == -1) break;out.write(b, 0, r);}}
}

10.@SneakyThrows 注解:

利用了这一机制,将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息,使用注解后不需要担心Exception的处理。例如:

import lombok.SneakyThrows;public class SneakyThrowsExample implements Runnable {@SneakyThrows(UnsupportedEncodingException.class)public String utf8ToString(byte[] bytes) {return new String(bytes, "UTF-8");}@SneakyThrowspublic void run() {throw new Throwable();}
}

真正生成的代码

import lombok.Lombok;public class SneakyThrowsExample implements Runnable {public String utf8ToString(byte[] bytes) {try {return new String(bytes, "UTF-8");} catch (UnsupportedEncodingException e) {throw Lombok.sneakyThrow(e);}}public void run() {try {throw new Throwable();} catch (Throwable t) {throw Lombok.sneakyThrow(t);}}
}

11.@Accessors

@Accessors 一个为getter和setter方法设计的更流畅的注解
这个注解要搭配@Getter与@Setter使用,用来修改默认的setter与getter方法的形式。
@Accessors属性详解

fluent 属性 : 链式的形式 这个特别好用,方法连缀越来越方便了
chain 属性 : 流式的形式(若无显示指定chain的值,也会把chain设置为true)
prefix 属性 : 生成指定前缀的属性的getter与setter方法,并且生成的getter与setter方法时会去除前缀
测试不使用@Accessors时
在这里插入图片描述
fluent属性

默认为false,当该值为 true 时,对应字段的 getter 方法前面就没有 get,setter 方法就不会有 set。

在这里插入图片描述
编译后生成:

public class Demo {private final int finalVal = 10;private String xxName;private int yyAge;public Demo() {}public int finalVal() {Objects.requireNonNull(this);return 10;}public String xxName() {return this.xxName;}public int yyAge() {return this.yyAge;}public Demo xxName(String xxName) {this.xxName = xxName;return this;}public Demo yyAge(int yyAge) {this.yyAge = yyAge;return this;}public String toString() {int var10000 = this.finalVal();return "Demo(finalVal=" + var10000 + ", xxName=" + this.xxName() + ", yyAge=" + this.yyAge() + ")";}
}

使用:

public class Main {public static void main(String[] args) {Demo demo = new Demo();// setter方法; 这里包含了chain=true的功能,可以链式设置值demo.xxName("lucky").yyAge(20);// getter方法System.out.println(demo.xxName() + "," + demo.yyAge());System.out.println("demo = " + demo);}
}

chain属性

不写默认为false,当该值为 true 时,对应字段的 setter 方法调用后,会返回当前对象, 进行链式设置值

在这里插入图片描述
编译后生成:

public class Demo {private final int finalVal = 10;private String xxName;private int yyAge;public Demo() {}public int getFinalVal() {Objects.requireNonNull(this);return 10;}public String getXxName() {return this.xxName;}public int getYyAge() {return this.yyAge;}public Demo setXxName(String xxName) {this.xxName = xxName;return this;}public Demo setYyAge(int yyAge) {this.yyAge = yyAge;return this;}public String toString() {int var10000 = this.getFinalVal();return "Demo(finalVal=" + var10000 + ", xxName=" + this.getXxName() + ", yyAge=" + this.getYyAge() + ")";}
}

使用

public class Main {public static void main(String[] args) {Demo demo = new Demo();// setter方法demo.setXxName("lucky").setYyAge(20);System.out.println("demo = " + demo);}
}

prefix属性
该属性是一个字符串数组,当该数组有值时,表示忽略字段中对应的前缀,生成对应的 getter 和 setter 方法。

如果,我们把它的前缀加到 @Accessors 的属性值中,则可以像没有前缀那样,去调用字段的 getter和 setter 方法。

在这里插入图片描述
这里只是把原有属性的前缀给去掉

相关文章:

Lombok 常用注解

文章目录简介MAVEN 依赖常用的注解1. Data 注解 :2. Setter 注解&#xff1a;3.Getter 注解&#xff1a;4.Log4j or Slf4j 注解5.NoArgsConstructor注解&#xff1a;6.AllArgsConstructor注解&#xff1a;7.RequiredArgsConstructor注解:8.Builder注解&#xff1a;9.Cleanup注解…...

SAP 生产订单和成本收集器在核算上的主要区别

生产订单&#xff1a; 特点&#xff1a; 1、 按照批次进行核算 2、 只有完全完工&#xff0c;才能够进行差异分析&#xff0c;分析差异来源。 目标制造费用&#xff1a;按照工单创建确认的作业数量*计划作业价格的乘积得到&#xff1b; 实际制造费用&#xff1a;按照作业确认…...

Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流

场景 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流&#xff1a; Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_win nginx-rtmp最新版_霸道流氓气质的博客-CSDN博客 Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流&…...

【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)

【大数据处理与可视化】一 、大数据分析环境搭建&#xff08;安装 Anaconda 3 开发环境&#xff09;实验目的实验内容实验步骤一、下载Anaconda安装包二、安装Anaconda3三、验证Anaconda是否安装成功四、Jupyter Notebook的使用1. 启动Anaconda自带的Jupyter Notebook2. 在code…...

Python3-输入和输出

Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。…...

Java后端通用接口设计

1、接口的响应要明确表示接口的处理结果 为了将接口设计得更合理&#xff0c;我们需要考虑如下两个原则&#xff1a; 对外隐藏内部实现。即服务A调用服务B&#xff0c;如果服务B异常&#xff0c;但是我们不要直接把服务B的状态码、错误描述直接暴露给用户&#xff1b; 设计接…...

万字长文带你走进MySql优化(系统层面优化、软件层面优化、SQL层面优化)

文章目录系统层面优化采用分布式架构使用缓存使用搜索引擎软件层面优化调整 MySQL 参数配置定期清理无用数据创建索引创建索引普通索引唯一索引全文索引组合索引空间索引主键索引外键索引索引前缀适合创建索引的场景不适合创建索引的场景优化表结构分库分表SQL优化explain执行计…...

云原生安全2.X 进化论系列|云原生安全2.X未来展望(4)

随着云计算技术的蓬勃发展&#xff0c;传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展&#xff0c;成为赋能业务创新的重要推动力&#xff0c;并已经应用到企业核心业务。然而&#xff0c;云原生技…...

认识进程 -了解进程调度

前言 本篇通过介绍操作系统OS的重要功能&#xff0c;了解并发并行, 了解操作系统的一项重要功能 “进程管理” , 通过了解进程管理认识进程是操作系统资源分配的基本单位 ,如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章…...

第十届省赛——7外卖店优先级

题目&#xff1a;“饱了么”外卖系统中维护着N 家外卖店&#xff0c;编号1~N。每家外卖店都有一个优先级&#xff0c;初始时(0 时刻) 优先级都为0。每经过1 个时间单位&#xff0c;如果外卖店没有订单&#xff0c;则优先级会减少1&#xff0c;最低减到0&#xff1b;而如果外卖店…...

做自动化测试选择Python还是Java?

今天&#xff0c;我们来聊一聊测试人员想要进阶&#xff0c;想要做自动化测试&#xff0c;甚至测试开发&#xff0c;如何选择编程语言 前言 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。特别是…...

C#基础之基础语法(一)

总目录 文章目录总目录前言一、C#简述1 C#是什么&#xff1f;2 .Net平台3. C# 和.Net的关系4. 集成开发环境&#xff08;IDE&#xff09;二、控制台应用程序1. 常用代码2.注意事项三、基础语法1.编写C#代码注意事项2.C#注释2. 变量&标识符&关键字4. 变量&#xff0c;字…...

【JVM篇1】认识JVM,内存区域划分,类加载机制

目录 一、JVM内存区域划分 ①程序计数器(每个线程都有一个) ②栈&#xff1a;保存了局部变量和方法调用的信息(每一个线程都有一个栈) 如果不停地调用方法却没有返回值&#xff0c;会产生什么结果 ③堆(每一个进程都有一个堆&#xff0c;线程共享一个堆) 如何区分一个变量是…...

CHAPTER 5 文件共享 - FTP

文件共享 - FTP1 FTP1.1 传输方式1. ASCII传输方式2. 二进制传输模式3. 两种传输方式的区别1.2 支持的模式1. 主动模式(PORT)2. 被动模式(PASV)3. 如何选择4. 为什么绝大部分互联网应用都是被动模式&#xff1f;1.3 搭建FTP服务器&#xff08;使用vsftpd&#xff09;1. 安装软件…...

【MySQL】将 CSV文件快速导入 MySQL 中

【MySQL】将 CSV文件快速导入 MySQL 中方法一&#xff1a;使用navicat等软件的导入向导如果出现中文乱码方法二&#xff1a;命令行导入&#xff08;LOAD DATA INFILE SQL&#xff09;一般来说&#xff0c;将csv文件导入mysql数据库有两种办法&#xff1a; 使用 navicat、workbe…...

Ngnix安装教程(2023.3.8)

Nginx安装教程&#xff08;2023.3.8&#xff09;引言1、Nginx简介2、Nginx安装2.1 下载Nginx安装包2.2 免安装启动Nginx&#xff08;切记解压后将nginx-1.23.3文件夹需要放在英文路径下&#xff0c;实测中文路径不识别且启动不成功&#xff09;2.3 熟悉Nginx文件夹目录结构2.4 …...

【C语言】每日刷题 —— 牛客(2)

前言 大家好&#xff0c;继续更新专栏c_牛客&#xff0c;不出意外的话每天更新十道题&#xff0c;难度也是从易到难&#xff0c;自己复习的同时也希望能帮助到大家&#xff0c;题目答案会根据我所学到的知识提供最优解。 &#x1f3e1;个人主页&#xff1a;悲伤的猪大肠9的博客…...

关于算法的一些简单了解

文章目录ALGORITHMBASIC INFORMATIONBasic algorithm design technology穷举法分治法减治法动态规划法贪心法Algorithm design technology based on search回溯法分支限界法PRACTICECONCEPTCALATION*CODEprim&dijkstra&kruskal分治法Q&AT(n)T(n)T(n) 是渐进时间复杂…...

mysql无法启动服务及其他问题总结

文章目录1.安装后关于配置的问题显示【发生系统错误&#xff0c;拒绝访问】命令行Command Line Client闪退2.显示【MySQL服务无法启动】问题检查端口被占用删除data文件并初始化配置my.ini/.conf文件重新安装MySQL1.安装后关于配置的问题 显示【发生系统错误&#xff0c;拒绝访…...

数据库表字段命名规范

因为近期笔者在数据库命名规范上产生了一些疑问&#xff0c;故特此记录下来了一些开发规范&#xff0c;望做参考。 摘要&#xff1a; 当前研发工作中经常出现因数据库表、数据库表字段格式不规则而影响开发进度的问题&#xff0c;在后续开发使用原来数据库表时&#xff0c;也会…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...