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

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编译阶段给被注解的类加上对应的方法

Annotation_Processing
Lmobok_Annotation_Processor处理
AST语法树解析开始
AST语法树修改
Lombok_Annotation_Handler
开始
解析并转换为Java源文件
AST语法树修改完成
分析并生成字节码Class文件
结束

安装

使用

  • 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

常用

  1. @Getter/@Setter
  2. @ToString
  3. @EqualsAndHashCode
  4. @NonNull
  5. @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstruor
  6. @Data
  7. @Builder
  8. @Log
  9. val
  10. @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框架。本文我们来学习下它的使用和相关源码 来自官网的介绍&#xff1a; Koa 是一个新的 web 框架&#xff0c;由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。…...

一种延迟加载自定义元素的方法

您可能实际上并不需要所有这些&#xff1b;通常有一个更简单的方法。如果有意使用&#xff0c;此处显示的技术可能仍然对您的工具集有用。 为了保持一致性&#xff0c;我们希望我们的自动加载器也成为一个自定义元素——这也意味着我们可以通过 HTML 轻松配置它。但首先&#…...

Pytho经典面试题荟萃:第一期

目录 一、面试题 二、参考答案 解释器和编译器的区别 解释器 编译器 Python 的解释过程 Python 内存管理 Python 内存分配 引用计数 垃圾回收 其他内存管理技术 多重继承 多重继承带来的问题 命名冲突 菱形继承问题 解决多重继承带来的问题 方法重写 调用 su…...

01背包问题(大彻大悟版)

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

【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】

银河麒麟服务器操作系统更改用户密码 1.启动主机进入 grub 菜单&#xff0c;如图 1.1 以最新版本 Kylin-Server-10-SP2-x86-Release-Build09-20210524 为例。 图 1.1 grub 菜单 2 编辑 kernel 2.1按下”e”输入&#xff0c;输入用户名和密码&#xff08;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总结&#xff1a;四、导航栏自动弹出子…...

【C语言】每日刷题 —— 牛客语法篇(4)

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

HashMap ConcurrentHashMap介绍

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

C++语法规则3(C++面向对象)

多态 C多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数&#xff1b; 形成多态必须具备三个条件&#xff1a; 必须存在继承关系&#xff1b;继承关系必须有同名虚函数&#xff08;其中虚函数是在基类中使用关键字 virtual 声明的函数&#…...

Python tkinter 如何实现网站下载工具?将所有数据一键获取

前言 铁汁们有没有想过&#xff0c;如何把几个代码的功能结合到一起呢&#xff1f; 有想过的话&#xff0c;有没有实现过呢&#xff1f; 其实很简单的啊&#xff0c;咱就写一个界面就好了&#xff0c;想要哪个代码运行&#xff0c;鼠标轻轻一点就行 开发环境 python 3.8: 解…...

第六章:C语言数据结构与算法初阶之栈

系列文章目录 文章目录系列文章目录前言一、栈二、栈的实现三、接口函数的实现1、初始化2、销毁栈3、压栈与出栈4、判空5、元素个数6、返回栈顶元素四、栈中元素的访问总结前言 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 一、…...

Android学习之WebView

什么是WebView WebView是Android中UI组件的一种&#xff0c;WebView基于webkit内核&#xff0c;不过由于兼容性的原因在Android5.0后改为了Chromium内核。 WebView可以用来展示网页&#xff0c;常用于我们不想打开浏览器但又想浏览网页的情况。 WebView的使用 WebVeiw的常用…...

3/11 考试总结

时间安排 7:30–7:50 读题&#xff0c;T1 是个利用随机性的题目&#xff0c;T2 dp,T3 不知道是啥。 7:50–8:30 T1,对于随机有个结论时最值突变不超过 log &#xff0c;于是可以处理出所有 log 个区间然后统计答案&#xff0c;但这暴力做是个 3log 铁定过不去。 8:30–8:50 T2…...

Leetcode 141.环形链表 142环形链表II

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

hibernate学习(五)

hibernate学习&#xff08;五&#xff09; hibernate的一对多关联映射&#xff1a; 一、数据库表与表之间关系 一对多建表原则&#xff1a; 多对多的建表原则&#xff1a; 一对一建表原则&#xff1a; &#xff08;1&#xff09;唯一外键对应&#xff1a; &#xff08;…...

STM32CubeIDE 快速开发入门指南

描述 STM32CubeIDE是一体式多操作系统开发工具&#xff0c;是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C开发平台&#xff0c;具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse/CDT™框架和用于开发的GCC工具链&#xf…...

华为OD机试 - 火星文计算(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:火星文计…...

超超超超保姆式详解——字符函数和字符串函数(学不会打我)上

目录 长度不受限制的字符串函数 strlen部分 strlen函数的易错小知识 strlen函数的实现 strcpy部分 strcat部分 自己实现strcat strstr函数部分 简单例子&#xff1a; 分析 strcmp部分 长度受限制的字符串函数 strncpy 简单例子 strncat strncmp 简单例子 &…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...