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

【简化开发】lombok的使用、编译后的代码及源码

lombok的使用

  • 导入依赖
  • 一、@getter、@Setter、@toString
    • 1、@getter、@Setter分别生成getxxx()和setxxx()方法
    • 2、@toString生成toString()方法,按顺序打印类名称以及每个字段,并以逗号分隔
  • 二、@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
    • 1、@NoArgsConstructor无参构造函数
      • staticName
      • onConstructor
      • access
      • force
    • 2、@RequiredArgsConstructor
    • 3、@AllArgsConstructor
  • 三、@Data
  • 四、@Builder、@Singular
    • @Builder
    • @Singular

文章较长,可以按需查阅

导入依赖

首先Maven项目在pom.xml导入依赖

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

一、@getter、@Setter、@toString

1、@getter、@Setter分别生成getxxx()和setxxx()方法

可以将注解加需要生成getter和setter方法的成员变量上。
如果加在了类上,但是要某个成员变量生成特殊getter和setter怎么办?
可以直接手动编写该变量的getter和sette方法,当lombok检测到你已经为该变量编写了相应的getter和setter方法后,就不会再自动生成了。

2、@toString生成toString()方法,按顺序打印类名称以及每个字段,并以逗号分隔

二、@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor

1、@NoArgsConstructor无参构造函数

@NoArgsConstructor注解共有staticName、onConstructor、access以及force四个属性参数可以进行配置:

staticName

staticName代表的是是否生成静态构造方法,也就是说当staticName属性有值时则会生成一个静态构造方法,这时无参构造方法会被私有,然后创建一个指定名称的静态构造方法,并且是公有的,如下所示:

/*** 编译前代码*/
@RequiredArgsConstructor(staticName = "UserStatic")
public class UserInfo() {private String username;private String password;
}/*** 编译后代码*/
public class UserInfo() {private String username;private String password;private UserInfo() {}public UserStatic() {return new UserStatic();}
}

onConstructor

onConstructor
经常写Spring或者SpringBoot代码的人应该知道,Spring对于依赖注入提供了三种写法,分别是属性注入、Setter方法注入以及构造器注入,但是在日常工作中我们更多采用的是依赖于@Autowired注解方式进行依赖注入,不过过多的依赖注入会使我们的代码过于冗长,甚至Spring4.0起就已经开始不推荐这种写法了,而是推荐使用Setter方法注入以及构造器注入,lombok的生成构造器的方法就可以很方便的实现这种写法。
举一个通过构造器注入的例子:

@Controller
public class SysLoginController() {private final TokenUtils tokenUtils;private final SysLoginService sysLoginService;/*** 在这里 @Autowired 是可以省略的,在这里使用只是为了介绍 onConstructor 参数*/@Autowiredpublic SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {this.tokenUtils = tokenUtils;this.sysLoginService = sysLoginService;}
}

这样注入Bean在数量较多时我们仍需编写大量代码,这个时候就可以使用@RequiredArgsConstructor注解来解决这个问题,至于为什么不使用@AllArgsConstructor注解是因为这个注解是针对所有参数的,而在这个情境下,我们只需构造Bean所对应的属性而不是非Bean,所以我们只需在Bean对应的属性前加上final关键字进行修饰就可以只生成需要的有参构造函数,如下所示:

/*** 编译前*/
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SysLoginController() {private final TokenUtils tokenUtils;private final SysLoginService sysLoginService;
}/*** 编译后*/
public class SysLoginController() {private final TokenUtils tokenUtils;private final SysLoginService sysLoginService;@Autowiredpublic SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {this.tokenUtils = tokenUtils;this.sysLoginService = sysLoginService;}
}

access

有的时候我们会使用单例模式,这个时候需要我们创造一个私有的无参构造方法,那么就可以使用access这样一个属性来设置构造起的权限,如下所示:

/*** 编译前代码*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class UserInfo() {private String username;private String password;
}/*** 编译后代码*/
public class UserInfo() {private String username;private String password;private UserInfo() {}
}

access的可选等级:
public enum AccessLevel {
PUBLIC,
MODULE,
PROTECTED,
PACKAGE,
PRIVATE,
NONE;

private AccessLevel() {
}

}

force

当类中有被final关键字修饰的字段未被初始化时,编译器会报错,这时也可以设置force属性为true来为字段根据类型生成一个默认值0/false/null,这样编译器就不会再报错了,如下所示:

/*** 编译前代码*/
@RequiredArgsConstructor(force = true)
public class UserInfo() {private final String gender;private String username;private String password;
}/*** 编译后代码*/
public class UserInfo() {private final String gender = null;private String username;private String password;private UserInfo() {}
}

2、@RequiredArgsConstructor

@RequiredArgsConstructor在类上使用,这个注解可以生成带参或者不带参的构造方法。
若带参数,只能是类中所有带有@NonNull注解的和以final修饰的未经初始化的字段,如下所示:

/*** 编译前代码*/
@RequiredArgsConstructor
public class UserInfo() {private final String gender;@NonNullprivate String username;private String password;
}/*** 编译后代码*/
public class UserInfo() {private final String gender;@NonNullprivate String username;private String password;public UserInfo(String gender, @NonNull String username) {if (username == null) {throws new NullPointerException("username is marked @NonNull but is null");} else {this.gender = gender;this.username = username;}}
}

参数配置参照@NoArgsConstructor源码详解

3、@AllArgsConstructor

@AllArgsConstructor在类上使用,这个注解可以生成全参构造函数,且默认不生成无参构造函数。
不过需要注意的是,这里所说的全参并不包括已经被初始化的被final关键字修饰的字段,因为字段一旦被final关键字修饰被赋值后就不能再被修改,如下所示:

/*** 编译前代码*/
@RequiredArgsConstructor
public class UserInfo() {private final String gender;private final Integer age = 18;private String username;private String password;
}/*** 编译后代码*/
public class UserInfo() {private final String gender;private final Integer age = 18;private String username;private String password;public User(String gender, String username, String password) {this.gender = gender;this.username = username;this.password = password;}
}

参数配置参照@NoArgsConstructor源码详解

三、@Data

@Data注解包含了@Getter@Setter,且有toString(),equals(),canEqual()等方法

四、@Builder、@Singular

@Builder

在lombok日常使用场景中,总会碰到对象中包含集合的情况,这种情况下,我们对于对象中集合的赋值就需要像其他属性一样使用set方法进行赋值操作:

@Data
@Builder
class Student{private String name;private List<String> skills;
}

builder源码剖析:

public static class StudentBuilder {// 省略其他部分public Student.StudentBuilder skills(List<String> skills) {this.skills = skills;return this;}
}

这种方式来初始化集合属性不能说是错的,但是用起来还是不够人性化,我们对集合进行构建时主要也是为其添加元素,因此能不能有一个专门为该集合添加元素的方法,同时将集合的实例化隐藏在代码内部的操作呢,答案是肯定的,这就是接下来介绍的@Singular的作用.

@Singular

/*** 编译前代码*/
@Builder
class Student{private String name;@Singularprivate List<String> skills;
}/*** 编译后代码*/
class Student {private String name;private List<String> skills;Student(String name, List<String> skills) {this.name = name;this.skills = skills;}public static StudentBuilder builder() {return new StudentBuilder();}public static class StudentBuilder {private String name;private ArrayList<String> skills;StudentBuilder() {}public StudentBuilder name(String name) {this.name = name;return this;}public StudentBuilder skill(String skill) {if (this.skills == null) {this.skills = new ArrayList();}this.skills.add(skill);return this;}public StudentBuilder skills(Collection<? extends String> skills) {if (skills == null) {throw new NullPointerException("skills cannot be null");} else {if (this.skills == null) {this.skills = new ArrayList();}this.skills.addAll(skills);return this;}}public StudentBuilder clearSkills() {if (this.skills != null) {this.skills.clear();}return this;}public Student build() {List skills;switch (this.skills == null ? 0 : this.skills.size()) {case 0:skills = Collections.emptyList();break;case 1:skills = Collections.singletonList(this.skills.get(0));break;default:skills = Collections.unmodifiableList(new ArrayList(this.skills));}return new Student(this.name, skills);}public String toString() {return "Student.StudentBuilder(name=" + this.name + ", skills=" + this.skills + ")";}}
}

对比与上一份代码,加入了@Singular注解后,lombok为我们添加了一个为集合添加元素的方法skill(),当我们不指定方法名时,lombok会根据英文自动推导出方法名,如:skills -> skill,集合名称为:skills,那么它会将复数去掉后,剩下的单词就是方法名称了。我们可以自定义方法名的名称@Singular(“addSkill”)。如果使用了不规范的命名则一定要指定方法名。

如有错误,还请多多指教!
转载或者引用本文内容请注明来源及原作者:橘足轻重;

相关文章:

【简化开发】lombok的使用、编译后的代码及源码

lombok的使用导入依赖一、getter、Setter、toString1、getter、Setter分别生成getxxx()和setxxx()方法2、toString生成toString()方法&#xff0c;按顺序打印类名称以及每个字段&#xff0c;并以逗号分隔二、NoArgsConstructor、RequiredArgsConstructor、AllArgsConstructor1、…...

在线就能用的主图设计素材,免费分享!

如何给自己的店铺商品设计专属的节日活动主图&#xff1f;没有节日活动的主体素材要如何设计&#xff1f;下面小编就分享一个在线素材设计工具&#xff0c;打开乔拓云&#xff0c;平台里面不仅有许多能使用的电商设计素材&#xff0c;还有许多的设计工具和模板能帮助你快速的实…...

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…...

山东双软认证的基本条件

​一、山东双软认证的基本条件 "双软认证"是指软件产品评估和软件企业评估;企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策&#xff1b;我们…...

TPM 2.0实例探索3 —— LUKS磁盘加密(4)

接前文&#xff1a;TPM 2.0实例探索2 —— LUKS磁盘加密&#xff08;3&#xff09; 本文大部分内容参考&#xff1a; Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR TPM平台配置寄存器&#xff08;…...

Linux连接RDP远程服务工具集记录

目录 rdesktop 安装 实例 xfreerdp 安装 实例 remmia 介绍 rdesktop 安装...

离散事件动态系统

文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from&#xff1a;离散事件系统建模 离散事件动态系统的基本组成元素 &#xff08;1&am…...

无线WiFi安全渗透与攻防(二)之打造专属字典

系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 打造专属字典 什么在破解之前先准备专用字典&#xff0c;因为对于一般家庭来说&#xff0c;常用 一个是预共享密钥PSK&#xff0c;一个是PIN码。 也不是所有的路由都开起了PIN码&#xff0c;一般都会开启域共享密钥…...

拥抱 Spring 全新 OAuth 解决方案

以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用 作为 SpringBoot 3.0 的…...

前端开发与vscode开发工具介绍

文章目录1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行…...

C++---最长上升子序列模型---友好城市(每日一道算法2023.3.2)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; Palmia国有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…...

maven高级知识。

目录 一、分模块开发 1、分模块开发设计 2、依赖管理 二、继承和聚合 1、聚合 2、继承 三、属性 1、基本介绍 2、版本管理 四、多环境配置与应用 1、多环境开发 2、跳过测试 五、私服 1、私服安装 2、私服仓库分类 一、分模块开发 1、分模块开发设计 ▶ 示意图 …...

Python 之 Pandas 处理字符串和apply() 函数、applymap() 函数、map() 函数详解

文章目录一、处理字符串1. 向量化字符串操作简介2. str 方法的简介二、apply() 函数详解三、applymap() 函数详解四、map() 函数详解一、处理字符串 当我们遇到一个超级大的 DataFrame&#xff0c;里面有一列类型为字符串&#xff0c;要将每一行的字符串都用同一方式进行处理&…...

汇川AM402和上位机C#ModebusTcp通讯

目录 一、测试任务 二、测试环境 三、PLC工程 1、组态配置 2、ip地址、端口号 3、全局变量定义 四、C#端Winform程序创建 1创建主界面 2、创建子窗口 3、运行生成&#xff0c;界面效果 4、Modebus协议说明 5、Modebus操作说明 六、测试 1、寄存器读测试 2、MW1300寄…...

给你一个电商网站,你如何测试?功能测试及接口测试思路是什么?

功能测试思路 1、注册测试&#xff1a; 测试注册表单是否可以正确提交用户信息&#xff1b; 测试注册表单是否有输入限制&#xff0c;例如密码长度、邮箱格式等&#xff1b; 测试注册后是否可以正常登录。 2、登录测试&#xff1a; 测试登录表单是否可以正确提交用户信息&…...

Spring Boot 3.0系列【5】基础篇之应用配置文件

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言应用配置文件文件格式YAML获取配置属性方式1:@Value方式2: @ConfigurationProperties方式3: @PropertySource方式4…...

SQLyog图形化界面工具【超详细讲解】

目录 一、SQLyog 介绍 二、SQLyog 社区版下载 三、SQLyog 安装 1、选择Chinese后点击OK 2、点击“下一步” 3、选择“我接受”后点击“下一步” 4、点击“下一步” 5、修改安装位置&#xff08;尽量不要安装在C盘&#xff09;&#xff0c;点击“安装” 6、安装后点击“…...

Linux: 中断只被GIC转发到CPU0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI 中断CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…...

模电学习10. MOS管简单应用电路

模电学习10. MOS管简单使应用电路一、开关和放大器1. 开关电路2. 放大电路二、时序电路中作为反相器使用三、双向电平转换电路1. 原理图2. 工作状态分析&#xff08;1&#xff09;分析SDA&#xff0c;信号从左向右&#xff08;2&#xff09;分析SDA&#xff0c;信号从右向左四、…...

轻松搞懂Linux中的用户管理

文章目录概念用户账户用户组用户权限用户管理工具概念 用户管理是Linux系统管理员必须掌握的重要技能之一。Linux系统是一个多用户操作系统&#xff0c;可以支持多个用户同时使用&#xff0c;每个用户拥有自己的账户和权限&#xff0c;因此管理员需要了解如何创建、管理和删除…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...