Lombok
文章目录
- 简介
- 原理
- 安装
- 常用
- @Getter、@Setter
- @ToString
- @EqualsAndHashCode
- @NonNull
- @NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
- @DATA
- @Builder
- @Log
- val
- @Cleanup
简介
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.通过注解帮助开发人员消除Java中的冗长代码(简单的Java对象)
原理
JSR 269:插件化注解处理API
javac编译阶段给被注解的类加上对应的方法
安装
使用
javac
- 拷贝jar到类路径
- javac -cp lombok.jar [待编译的包]
Maven
引入依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>compile</scope> </dependency>
Intelllij IDEA
- 安装Lombok插件
- Go to
File>Settins>Plugins
- Clik on
Browse repositories
- Seach for
Lombok Plugin
- Clik on
Install plugin
- Restart Intellij IDEA
常用
- @Getter/@Setter
- @ToString
- @EqualsAndHashCode
- @NonNull
- @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstruor
- @Data
- @Builder
- @Log
- val
- @Cleanup
@Getter、@Setter
可以用于类和成员变量上
@Getter //public,默认值
@Getter(AccessLeavel.PUBLIC) //public
@Getter(AccessLeavel.PROTECTED) //protected
@Getter(AccessLeavel.NONE) //不生成Getter方法@Setter //public,默认值
//对被static修饰的变量不产生效果
//对被final修饰的变量只产生getter方法,不产生setter方法
@Getter
@Setter
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String getUserName() {return this.userName;}public Integer getAge() {return this.age;}public void setUserName(String userName) {this.userName = userName;}public void setAge(Integer age) {this.age = age;}
}
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PROTECTED)
public class User {@Getter(AccessLevel.NONE)private String userName;@Setter(AccessLevel.NONE)private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}private Integer getAge() {return this.age;}protected void setUserName(String userName) {this.userName = userName;}
}
@Getter
@Setter(AccessLevel.PUBLIC)
public class User {private final String userName="";private static Integer age;
}//编译后
public class User {private final String userName = "";private static Integer age;public User() {}public String getUserName() {this.getClass();return "";}
}
@ToString
//仅支持添加到类上
@ToString //默认不排除任何字段
@ToString(exclude={"email","password"}) //排除email和password
@ToString(of={"userName","age"}); //只输出userName和password字段
@ToString
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String toString() {return "User(userName=" + this.userName + ", age=" + this.age + ")";}
}
@ToString(of = {"userName"},exclude = {"userName"})
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String toString() {return "User(userName=" + this.userName + ")";}
}
@EqualsAndHashCode
boolean equals(Object); //判断对象是否相等
boolean canEqual(Object); //判断对象是不是该类的一个实例
int hashCode(); //计算对象的hash值@EqualsAndHashCode(excelude={"phone","password"}) //排除phone、password字段
@EqualsAndHashCode(of={"userName","passwd"}) //仅判断userName与passwd属性
@EqualsAndHashCode
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof User)) {return false;} else {User other = (User)o;if (!other.canEqual(this)) {return false;} else {Object this$userName = this.userName;Object other$userName = other.userName;if (this$userName == null) {if (other$userName != null) {return false;}} else if (!this$userName.equals(other$userName)) {return false;}Object this$age = this.age;Object other$age = other.age;if (this$age == null) {if (other$age != null) {return false;}} else if (!this$age.equals(other$age)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof User;}public int hashCode() {int PRIME = true;int result = 1;Object $userName = this.userName;result = result * 59 + ($userName == null ? 43 : $userName.hashCode());Object $age = this.age;result = result * 59 + ($age == null ? 43 : $age.hashCode());return result;}
}
@NonNull
//可以用于实参与属性值
public void test(@NonNll String s){//方法体
}//test()编译后
public void testj(@NonNull String s){if(s==null){throw new NullPonintException("s is marked non-null but is null");}else{//方法体}
}//调用时
mian(){test(null); //当传入的值为空时,会报出异常
}@NonNull
private String id; //调用时若id为空,会抛出异常
@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
@NoArgsConstructor //无参构造器
@RequiredArgsConstructor //自定义构造器,生成带有标记为@NonNull和无初始值的final的属性的构造器
@AllArgsConstructor //带有所有属性的构造器
@DATA
/*
集成了以下4个注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
*/
@Data
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String getUserName() {return this.userName;}public Integer getAge() {return this.age;}public void setUserName(String userName) {this.userName = userName;}public void setAge(Integer age) {this.age = age;}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof User)) {return false;} else {User other = (User)o;if (!other.canEqual(this)) {return false;} else {Object this$userName = this.getUserName();Object other$userName = other.getUserName();if (this$userName == null) {if (other$userName != null) {return false;}} else if (!this$userName.equals(other$userName)) {return false;}Object this$age = this.getAge();Object other$age = other.getAge();if (this$age == null) {if (other$age != null) {return false;}} else if (!this$age.equals(other$age)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof User;}public int hashCode() {int PRIME = true;int result = 1;Object $userName = this.getUserName();result = result * 59 + ($userName == null ? 43 : $userName.hashCode());Object $age = this.getAge();result = result * 59 + ($age == null ? 43 : $age.hashCode());return result;}public String toString() {return "User(userName=" + this.getUserName() + ", age=" + this.getAge() + ")";}
}
@Builder
//生成一个内部类
public class User{UserBuilder(){final String userName;final int age;UserBuilder(); //无参构造UserBuilder userName(String userName) //设置userName的值UserBuilder age(int age) //设置age}private String userName;private int age;UserBuilder builder()
}//调用,链式编程
main(){User user = User.bulder().userName("joey").age(18).build();
}
@Builder
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;User(String userName, Integer age) {this.userName = userName;this.age = age;}public static UserBuilder builder() {return new UserBuilder();}public static class UserBuilder {private String userName;private Integer age;UserBuilder() {}public UserBuilder userName(String userName) {this.userName = userName;return this;}public UserBuilder age(Integer age) {this.age = age;return this;}public User build() {return new User(this.userName, this.age);}public String toString() {return "User.UserBuilder(userName=" + this.userName + ", age=" + this.age + ")";}}
}
@Log
@Log
//调用log.info(Stirng)//
val
val map = new HashMap<String,String>();
//map不限制类型,在编译时确定map的类
@Cleanup
//使用Cleanup之前
InputStream in = null;
OutputStream out = null;
try{in = new FileInputStream("filepath");out = new FileoutputStream("path");byte[] b = new byte[1000];while(true){int r = in.read(b);if(r == -1) break;out.write(b,0,r);}
}finally{if(in != null){in.close();}if(out != null){out.close();}
}
//使用@Cleanup后
//可以省去关闭流的操作
@Cleanup InputStream in = new FileInputStream("filepath");
@Cleanup OutputStream out = new FileOutputStream("path");
//省去try-cath-finally等操作
byte[] b = new byte[1000];
while(true){int r = in.read(b);if(r == -1) break;out.write(b,0,r);
}
相关文章:
Lombok
文章目录简介原理安装常用Getter、SetterToStringEqualsAndHashCodeNonNullNoArgsConstructor、RequiredArgsConstructor、AllArgsConstructorDATABuilderLogvalCleanup简介 Project Lombok is a java library that automatically plugs into your editor and build tools, spi…...

Koa源码学习
前言 koa是一个非常流行的Node.js http框架。本文我们来学习下它的使用和相关源码 来自官网的介绍: Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。…...
一种延迟加载自定义元素的方法
您可能实际上并不需要所有这些;通常有一个更简单的方法。如果有意使用,此处显示的技术可能仍然对您的工具集有用。 为了保持一致性,我们希望我们的自动加载器也成为一个自定义元素——这也意味着我们可以通过 HTML 轻松配置它。但首先&#…...
Pytho经典面试题荟萃:第一期
目录 一、面试题 二、参考答案 解释器和编译器的区别 解释器 编译器 Python 的解释过程 Python 内存管理 Python 内存分配 引用计数 垃圾回收 其他内存管理技术 多重继承 多重继承带来的问题 命名冲突 菱形继承问题 解决多重继承带来的问题 方法重写 调用 su…...

01背包问题(大彻大悟版)
背包问题身为一个非常经典的动态规划问题,理清思路很重要,在经过多次观看y总视频和b站解析,加上CSDN的文章辅助,我终于从很多不理解到大彻大悟,下面是我对于背包问题思路的总结,有问题的话欢迎指出。谈到背…...

【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】
银河麒麟服务器操作系统更改用户密码 1.启动主机进入 grub 菜单,如图 1.1 以最新版本 Kylin-Server-10-SP2-x86-Release-Build09-20210524 为例。 图 1.1 grub 菜单 2 编辑 kernel 2.1按下”e”输入,输入用户名和密码(root/Kylin123123&…...
华为OD机试(20222023)考点分类
字符串,数组,集合操作 题库分值序号题目考点 or 实现Old1001敏感字段加密字符串,数组,集合操作Old1002IPv4地址转换成整数字符串,数组,集合操作Old1006字符串分割字符串,数组,集合操作Old1007...

初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解
目录一、遇到的不懂的标签属性详解1、meta 标签的 http-equiv 属性(元标签)二、遇到的 CSS 不懂的属性详解vertical-align三、如何规避 HTML 自动换行 - 脱离文档流配置属性 display: inline-block理解 inline、inline-block、blockinline总结:四、导航栏自动弹出子…...

【C语言】每日刷题 —— 牛客语法篇(4)
🚀🚀前言 大家好,继续更新专栏 c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页&am…...

HashMap ConcurrentHashMap介绍
目录 HashMap 数据结构 重要成员变量 Jdk7-扩容死锁分析 单线程扩容 多线程扩容 Jdk8-扩容 ConcurrentHashMap 数据结构 并发安全控制 源码原理分析 重要成员变量 协助扩容helpTransfer 扩容transfer 总结 CopyOnWrite机制 源码原理 HashMap 数据结构 数组…...

C++语法规则3(C++面向对象)
多态 C多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数; 形成多态必须具备三个条件: 必须存在继承关系;继承关系必须有同名虚函数(其中虚函数是在基类中使用关键字 virtual 声明的函数&#…...

Python tkinter 如何实现网站下载工具?将所有数据一键获取
前言 铁汁们有没有想过,如何把几个代码的功能结合到一起呢? 有想过的话,有没有实现过呢? 其实很简单的啊,咱就写一个界面就好了,想要哪个代码运行,鼠标轻轻一点就行 开发环境 python 3.8: 解…...

第六章:C语言数据结构与算法初阶之栈
系列文章目录 文章目录系列文章目录前言一、栈二、栈的实现三、接口函数的实现1、初始化2、销毁栈3、压栈与出栈4、判空5、元素个数6、返回栈顶元素四、栈中元素的访问总结前言 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 一、…...
Android学习之WebView
什么是WebView WebView是Android中UI组件的一种,WebView基于webkit内核,不过由于兼容性的原因在Android5.0后改为了Chromium内核。 WebView可以用来展示网页,常用于我们不想打开浏览器但又想浏览网页的情况。 WebView的使用 WebVeiw的常用…...
3/11 考试总结
时间安排 7:30–7:50 读题,T1 是个利用随机性的题目,T2 dp,T3 不知道是啥。 7:50–8:30 T1,对于随机有个结论时最值突变不超过 log ,于是可以处理出所有 log 个区间然后统计答案,但这暴力做是个 3log 铁定过不去。 8:30–8:50 T2…...

Leetcode 141.环形链表 142环形链表II
141环形链表 文章目录快慢指针快慢指针 代码思路: slow 和fast 指向 head slow走一步,fast走两步 没有环: fast每次走2步 ,如果 fast 最终遇到NULL(链表中的元素是 偶数)或者fast->next(链表中的元素是 奇数)遇到NULL…...

hibernate学习(五)
hibernate学习(五) hibernate的一对多关联映射: 一、数据库表与表之间关系 一对多建表原则: 多对多的建表原则: 一对一建表原则: (1)唯一外键对应: (…...

STM32CubeIDE 快速开发入门指南
描述 STM32CubeIDE是一体式多操作系统开发工具,是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse/CDT™框架和用于开发的GCC工具链…...
华为OD机试 - 火星文计算(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:火星文计…...

超超超超保姆式详解——字符函数和字符串函数(学不会打我)上
目录 长度不受限制的字符串函数 strlen部分 strlen函数的易错小知识 strlen函数的实现 strcpy部分 strcat部分 自己实现strcat strstr函数部分 简单例子: 分析 strcmp部分 长度受限制的字符串函数 strncpy 简单例子 strncat strncmp 简单例子 &…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...