【简化开发】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()方法,按顺序打印类名称以及每个字段,并以逗号分隔二、NoArgsConstructor、RequiredArgsConstructor、AllArgsConstructor1、…...
在线就能用的主图设计素材,免费分享!
如何给自己的店铺商品设计专属的节日活动主图?没有节日活动的主体素材要如何设计?下面小编就分享一个在线素材设计工具,打开乔拓云,平台里面不仅有许多能使用的电商设计素材,还有许多的设计工具和模板能帮助你快速的实…...
【测绘程序设计】——计算卫星位置
本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…...
山东双软认证的基本条件
一、山东双软认证的基本条件 "双软认证"是指软件产品评估和软件企业评估;企业申请双软认证除了获得软件企业和软件产品的认证资质,同时也是对企业知识产权的一种保护方式,更可以让企业享受国家提供给软件行业的税收优惠政策;我们…...
TPM 2.0实例探索3 —— LUKS磁盘加密(4)
接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(3) 本文大部分内容参考: Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR TPM平台配置寄存器(…...
Linux连接RDP远程服务工具集记录
目录 rdesktop 安装 实例 xfreerdp 安装 实例 remmia 介绍 rdesktop 安装...
离散事件动态系统
文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from:离散事件系统建模 离散事件动态系统的基本组成元素 (1&am…...
无线WiFi安全渗透与攻防(二)之打造专属字典
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 打造专属字典 什么在破解之前先准备专用字典,因为对于一般家庭来说,常用 一个是预共享密钥PSK,一个是PIN码。 也不是所有的路由都开起了PIN码,一般都会开启域共享密钥…...
拥抱 Spring 全新 OAuth 解决方案
以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护,该项目将不会再进行任何的迭代目前 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)
注意事项: 本题为"线性dp—最长上升子序列的长度"的扩展题,所以dp思路这里就不再赘述。 题目: Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的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,里面有一列类型为字符串,要将每一行的字符串都用同一方式进行处理&…...
汇川AM402和上位机C#ModebusTcp通讯
目录 一、测试任务 二、测试环境 三、PLC工程 1、组态配置 2、ip地址、端口号 3、全局变量定义 四、C#端Winform程序创建 1创建主界面 2、创建子窗口 3、运行生成,界面效果 4、Modebus协议说明 5、Modebus操作说明 六、测试 1、寄存器读测试 2、MW1300寄…...
给你一个电商网站,你如何测试?功能测试及接口测试思路是什么?
功能测试思路 1、注册测试: 测试注册表单是否可以正确提交用户信息; 测试注册表单是否有输入限制,例如密码长度、邮箱格式等; 测试注册后是否可以正常登录。 2、登录测试: 测试登录表单是否可以正确提交用户信息&…...
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、修改安装位置(尽量不要安装在C盘),点击“安装” 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初始化:缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…...
模电学习10. MOS管简单应用电路
模电学习10. MOS管简单使应用电路一、开关和放大器1. 开关电路2. 放大电路二、时序电路中作为反相器使用三、双向电平转换电路1. 原理图2. 工作状态分析(1)分析SDA,信号从左向右(2)分析SDA,信号从右向左四、…...
轻松搞懂Linux中的用户管理
文章目录概念用户账户用户组用户权限用户管理工具概念 用户管理是Linux系统管理员必须掌握的重要技能之一。Linux系统是一个多用户操作系统,可以支持多个用户同时使用,每个用户拥有自己的账户和权限,因此管理员需要了解如何创建、管理和删除…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
