【优雅代码】01-lombok精选注解及原理
【优雅代码】01-lombok精选注解及原理
欢迎关注b站账号/公众号【六边形战士夏宁】,一个要把各项指标拉满的男人。该文章已在github目录收录。
屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞、加个收藏这对我真的很重要。别下次一定了,都不关注上哪下次一定。
1.背景介绍
在日常开发中免不了进行一些繁琐的代码自动生成,虽然ide的功能已然非常强大但是并不能够做到动态,lombok可以非常好的解决这个问题。它会在生成class文件时将其进行编译成平常所写的代码,这里介绍一些我个人觉得比较好用的注解
2.lombok
先上官网地址。如果想了解更多注解可以去https://projectlombok.org/features/all
2.1.get/set注解(重要)
此部分注解有@Data、@Getter、@Setter,一般普通Bean对象会使用@Data注解(里面已经包含另外两个注解),如果是enum则使用@Getter注解
@Data
static class DataBean {
private String name;
}
// 使用方法如下
public static void DataBeanExample() {
log.info(new DataBean().getName());
}
生成核心代码如下
static class DataBean {
private String name;
public DataBean() {
}
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
...
}
2.2.常规构造方法注解(重要)
此部分注解包含@NoArgsConstructor无参构造、@AllArgsConstructor所有参构造、@EqualsAndHashCode、@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
static class ConstructorBean {
private String name1;
private String name2;
}
// 使用方法如下
public static void ConstructorExample() {
log.info(new ConstructorBean("1", "2").toString());
}
生成核心代码如下
static class ConstructorBean {
private String name1;
private String name2;
public ConstructorBean() {
}
public ConstructorBean(final String name1, final String name2) {
this.name1 = name1;
this.name2 = name2;
}
public boolean equals(final Object o) {
//....
}
protected boolean canEqual(final Object other) {
return other instanceof LombokExample.ConstructorBean;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $name1 = this.name1;
int result = result * 59 + ($name1 == null ? 43 : $name1.hashCode());
Object $name2 = this.name2;
result = result * 59 + ($name2 == null ? 43 : $name2.hashCode());
return result;
}
public String toString() {
return "LombokExample.ConstructorBean(name1=" + this.name1 + ", name2=" + this.name2 + ")";
}
}
2.4.build构造方法(重要)
此部分注解包含@Builder
@Builder
@ToString
static class BuilderBean {
private String name1;
private String name2;
}
// 使用方式如下
public static void BuilderExample() {
log.info(BuilderBean.builder().name1("1").name2("2").build().toString());
}
生成核心代码如下
static class BuilderBean {
private String name1;
private String name2;
BuilderBean(final String name1, final String name2) {
this.name1 = name1;
this.name2 = name2;
}
public static LombokExample.BuilderBean.BuilderBeanBuilder builder() {
return new LombokExample.BuilderBean.BuilderBeanBuilder();
}
public String toString() {
return "LombokExample.BuilderBean(name1=" + this.name1 + ", name2=" + this.name2 + ")";
}
public static class BuilderBeanBuilder {
private String name1;
private String name2;
BuilderBeanBuilder() {
}
public LombokExample.BuilderBean.BuilderBeanBuilder name1(final String name1) {
this.name1 = name1;
return this;
}
public LombokExample.BuilderBean.BuilderBeanBuilder name2(final String name2) {
this.name2 = name2;
return this;
}
public LombokExample.BuilderBean build() {
return new LombokExample.BuilderBean(this.name1, this.name2);
}
public String toString() {
return "LombokExample.BuilderBean.BuilderBeanBuilder(name1=" + this.name1 + ", name2=" + this.name2 + ")";
}
}
}
2.5.链式构造方法
此部分注解包含@Accessors,但是因为改写了set方法的返回值,有些时候会和其它bean工具类不兼容,一般不建议使用
@Accessors(chain = true)
@Setter
@ToString
static class ChainBean {
private String name1;
private String name2;
}
// 使用方式如下
public static void ChainExample() {
log.info(new ChainBean().setName1("1").setName2("2").toString());
}
生成核心代码如下
static class ChainBean {
private String name1;
private String name2;
ChainBean() {
}
public LombokExample.ChainBean setName1(final String name1) {
this.name1 = name1;
return this;
}
public LombokExample.ChainBean setName2(final String name2) {
this.name2 = name2;
return this;
}
...
}
2.6.日志注解(重要)
此部分注解包含@Slf4j,其它的注解都不重要,这个会自动根据引入包进行选择
@Slf4j
public class LombokExample {
public static void main(String[] args) {
log.info("123");
}
}
生成核心代码如下
private static final Logger log = LoggerFactory.getLogger(LombokExample.class);
2.7.关闭流
@Cleanup,这个可以帮助关闭流,需要注意的是需要对其捕获IO异常。虽然不错,但是有了trywith的写法以后就用的不多了。
public static void CloseExample() throws FileNotFoundException {
try {
@Cleanup FileInputStream fileInputStream = new FileInputStream("");
} catch (IOException e) {
}
}
生成核心代码如下
可以看到会帮我们进行close。不过并没有在finally里面不建议使用
public static void CloseExample() throws FileNotFoundException {
try {
FileInputStream fileInputStream = new FileInputStream("");
if (Collections.singletonList(fileInputStream).get(0) != null) {
fileInputStream.close();
}
} catch (IOException var1) {
}
}
这里推荐try-with-resources写法
public static void CloseExample2() {
try (FileInputStream fileInputStream = new FileInputStream("")) {
log.info("123");
} catch (IOException e) {
}
}
生成核心代码如下
可以看到是在finally里面关闭了流,并且各种判断非常全面
public static void CloseExample2() {
try {
FileInputStream fileInputStream = new FileInputStream("");
Throwable var1 = null;
try {
log.info("123");
} catch (Throwable var11) {
var1 = var11;
throw var11;
} finally {
if (fileInputStream != null) {
if (var1 != null) {
try {
fileInputStream.close();
} catch (Throwable var10) {
var1.addSuppressed(var10);
}
} else {
fileInputStream.close();
}
}
}
} catch (IOException var13) {
}
}
2.8.异常注解
在捕获编译时异常的时候比较好用,但是现在越来越多的工具类都对编译异常捕获了,它的出场机会并不多
@SneakyThrows({IOException.class})
public static void ExceptionExample() {
CloseExample();
}
生成核心代码如下
唯一的功能就是捕获编译时异常,不用手动去写
public static void ExceptionExample() {
try {
CloseExample();
} catch (IOException var1) {
throw var1;
}
}
3.delombok
如果后面不想用注解则需要使用delombok官网
- 方法一
在新版的idea中refactor->delombok已经集成了delombok,可以直接还原算是比较方便的

- 方法二
java -jar lombok.jar delombok src -d src-delomboked
注意替换包名
【优雅代码】01-lombok精选注解及原理的更多相关文章
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- Lombok的使用与原理
在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而 ...
- Java开发神器Lombok的使用与原理
在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复 ...
- 【优雅代码】02-java传个方法你会吗,不是Method对象
[优雅代码]02-java传个方法你会吗,不是Method对象 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮 ...
- Spring-扫描注解原理,注解自动扫描原理分析
注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-packa ...
- lombok的使用和原理
一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省 ...
- async异步注解和aspect切面注解等注解的原理
在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下spring是如何完成这个功能的. 1.spring 在扫描bean的 ...
- eclipse 按装lombok与注解说明
原文:http://www.cnblogs.com/ywqbj/p/5711691.html 一.安装lombok 1.下载 lombok-1.16.16.jar 包 我的下载完后放到:/root ...
- 来自lombok的注解(解决idea中的找不到get,set方法,找不到log的问题)
今天看代码,发现idea报错,仔细一看调用的get,set方法bean中都没有,但是运行起来却没有问题,这个让我很疑惑.后来发现在类上有一个以前没见过的注解@Data,大概就是因为有他的原因.这个注解 ...
随机推荐
- 【c++】解析多文件编程的原理
其实一直搞不懂为什么头文件和其他cpp文件之间的关系,今晚索性一下整明白 [c++]解析多文件编程的原理 a.cpp #include<stdio.h> int main(){ a(); ...
- 分配器——allocators
任何容器的构建都离不开分配器,分配器顾名思义就是分割配置内存资源的组件,分配器的效率直接影响力容器的效率. operator new()和malloc() C/C++底层都是通过malloc()调用系 ...
- 链栈(C++)
链栈,字面意思,就是用链表来实现一个栈的数据结构. 那么,只需将单链表的头节点当作栈顶,尾节点当作栈底.入栈只需要头插,出栈只需头删即可.所以只需要吧单链表稍微阉割一下就可以得到链式栈了.代码如下 / ...
- C++ 害死人不偿命的(3n+1)猜想
第一次刷PAT ,注意事项:就像普通编译器一样要导入头文件 还有 using namespace std:要不然会报错(鬼知道我经历了什么 微笑.jpg) 1 #include <iostrea ...
- 爬虫之正则表达式re模块
为什么要学正则表达式 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (去掉对我们没用处的数据) 处理数据(按照我们想要的 ...
- 【Linux】【CentOS7】免密登录突然失效
[报错解决]免密登录突然失效 哔哩哔哩 萌狼蓝天 博客:萌狼工作室-博客园 [问题描述] 原本配置好了的免密登录,今天启动hadoop发现免密登录失效了 [解决方案] 1.切换到管理员模式,进入配置文 ...
- array_filter()用法
第一种情况: 通过函数,过滤数组中的元素 array_filter($arr,'函数名称') 函数里可以写相应的过滤原则,下面举个栗子,过滤掉不是数字的元素 $arr=array('a','b','c ...
- WHUCTF PWN题目
花了大概两天时间来做WHUCTF的题目,第一次排名这么靠前.首先感谢武汉大学举办这次萌新赛,也感谢fmyy的师傅的耐心指导,让我第一次做出堆的题目来. pwnpwnpwn 这是一道栈题目,32位程序, ...
- IDEA 2021.2.1 破解版下载_激活安装图文教程(永久激活,亲测有效)
1.IntelliJ IDEA 2021 链接:https://pan.baidu.com/s/1Pwz3GrrkJdDZzg-wg5UjMw 提取码:56o6 无限重置 30 天试用期补丁 链接:h ...
- Struts拦截器设置完的值为什么在页面取不到
Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...