先看一下它的官网
英语懒得看?没关系。
它大致意思是:Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,你项目中所有诸如:对象的构造函数、 equals()
方法,属性的 get()/set()
方法等等,这些没有技术含量的代码统统都不用写了,Lombok帮你搞定一切,全部帮你自动生成!
听起来好像是挺不错...
眼见为虚,代码为实,本文亲自尝试一下!
首先在项目的 pom.xml
中引入 Lombok
依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
除此之外,还要在IDE中安装Lombok插件,并配置:
接下来进行代码实验。
以前我们写一个 POJO
对象时,比如定义一个课程 Course
,需要自己手动写上每个字段的 get()
和 set()
方法,就像这样:
public
class
Course {
private Long
id;
// 课程ID
private String
name;
// 课程名称
private Integer
score;
// 课程成绩
// 自己手写下面的 get/set 方法!
public Long
getId()
{
return id;
}
public void
setId(Long
id)
{
this.id
= id;
}
public String
getName()
{
return name;
}
public void
setName(String
name)
{
this.name
= name;
}
public Integer
getScore()
{
return score;
}
public void
setScore(Integer
score)
{
this.score
= score;
}
}
但是借助于Lombok,一切都变得优雅起来,代码篇幅省了一半
public class Course {
@Getter
@Setter
private Long id; // 课程ID
@Getter
@Setter
private String name; // 课程名称
@Getter
@Setter
private Integer score; // 课程成绩
}
两个注解:@Getter
和 @Setter
即可方便搞定。
在没有用Lombok之前,我们假如想new一个对象,我们往往会这么做(以上面的 Course
类为例):
Course
course =
new Course
(); // 首先new一个对象
// 然后逐步去装填对象的各个字段
course
.setId(
123l
);
course
.setName(
"高等数学"
);
course
.setScore(
100
);
引进Lombok之后,我们只需要在 Course
类上用上 @Builder
注解:
@Builder
public
class
Course {
private Long
id;
// 课程ID
private String
name;
// 课程名称
private Integer
score;
// 课程成绩
}
则 Course
类对象的创建即可使用 链式表达 的方式一行代码完成:
// 对象可以链式构造,一句话完成 !
Course course = Course.builder().id(123l).name("高等数学").score(100).build();
看到这里,如果你学过设计模式中的 “建造者模式” 的话,一定能猜到 @Builder
注解就是一个典型的“建造者模式”的实现案例!
建造者模式的链式调用用起来实在是很爽!
一、全参构造器不用写了
当你在你的类上使用了Lombok的注解 AllArgsConstructor
时:
@AllArgsConstructor
public
class
Course {
private Long
id;
// 课程ID
private String
name;
// 课程名称
private Integer
score;
// 课程成绩
}
这时候你的类在编译后会自动生成一个无参构造函数,就像这样:
public class Course {
private Long id; // 课程ID
private String name; // 课程名称
private Integer score; // 课程成绩
// Lombok自动会帮你生成一个全参构造器!!
public Course( Long id, String name, Integer score ) {
this.id = id;
this.name = name;
this.score = score;
}
}
二、无参数构造器也不用写了
当你在你的类上使用了Lombok的注解 NoArgsConstructor
时:
@NoArgsConstructor
public
class
Course {
private Long
id;
// 课程ID
private String
name;
// 课程名称
private Integer
score;
// 课程成绩
}
这时候你的类在编译后会自动生成一个无参构造函数,就像这样:
public class Course {
private Long id; // 课程ID
private String name; // 课程名称
private Integer score; // 课程成绩
// Lombok自动会帮你生成一个无参构造器!!
public Course() {
}
}
三、部分参数构造器也不用写了
当你在你的类上使用了Lombok的注解 RequiredArgsConstructor
时:
@RequiredArgsConstructor
public
class
Course {
private Long
id;
// 课程ID
private final
String name
; // 课程名称
private Integer
score;
// 课程成绩
}
这时候你的类在编译后会自动生成一个具备部分参数的构造函数,就像这样:
public class Course {
private Long id; // 课程ID
private final String name; // 课程名称
private Integer score; // 课程成绩
// 因为name字段定义成final,所以Lombok自动会帮你生成一个部分参数的构造器!!
public Course(String name) {
this.name = name;
}
}
因为 name
字段定义成 final
,所以 Lombok
自动会帮你生成一个部分参数的构造器!!
Lombok的 @NonNull
注解可以自动帮我们 避免空指针判断。该注解作用在方法参数上,用于自动生成空值参数检查,比如:
public static void output( String input ) {
// 作为一个严谨且良心的Java开发工程师
// 一般我们要手动对入参进行校验,就像下面这样 !
if( input == null ) {
System.out.println("该函数输入参数为空");
}
System.out.println( input );
}
但是有了Lombok之后,事情就变得简单了,一个注解搞定:
public static void output( @NonNull String input ) {
// 原先这里对 input 的判空不用手动做了
System.out.println( input );
}
什么意思呢?
假如我们要读取一个 txt
文本文件,一般会这样写代码:
BufferedReader
br =
null;
try
{
FileReader fileReader
= new
FileReader
("呵呵.tet"
);
// 定义文件
br
= new
BufferedReader
( fileReader
);
// 读取文件
System.out
.println(
br.readLine
()
);
// 读取文件一行内容
}
catch
(Exception
e)
{
e
.printStackTrace
();
}
finally
{
try {
br
.close();
// 无论如何文件句柄在使用结束后得手动关闭!!
} catch
(IOException
e)
{
e
.printStackTrace
();
}
}
注意,这个文件句柄在使用完成之后是一定要手动 close
的,否则就有可能 资源泄漏。
有了Lombok之后,这种擦屁股活儿统统不用干了,一个 @Cleanup
注解即可搞定
@Cleanup
BufferedReader
br =
null;
// 一个 @Cleanup注解搞定!
try
{
FileReader fileReader
= new
FileReader
("呵呵.tet"
);
br
= new
BufferedReader
( fileReader
);
System.out
.println
( br
.readLine
()
);
}
catch
(Exception
e)
{
e
.printStackTrace
();
}
比如我们打开一个 txt
文本文件:
public
void
openTxt(
String
filename )
{
try {
FileReader fileReader
=
new
FileReader(
filename );
} catch
(
FileNotFoundException e
)
{
e
.printStackTrace
();
}
}
这地方的 FileNotFoundException
异常,要么显式地在函数级抛出,要么就像上面一样 try/catch
内部消灭。
如果在编码时,不想处理这种繁杂的异常处理,你可以使用Lombok的 @SneakyThrows
注解进行简化,比如上面的代码就可以简化为:
@SneakyThrows
public
void
openTxt(
String
filename )
{
FileReader fileReader
=
new
FileReader(
filename );
}
这样你编码时就无需处理异常了。
必须友情提示的是:这样写你是爽了,但你很有可能会被队友一顿暴打,因为别人调用你编写的函数,并不能显式的获知需要处理哪些异常,这样容易留坑!
好了,受限于篇幅限制,抛砖引玉就到这里了。
上面列举了几个平时项目开发中使用非常频繁的Lombok注解,除此之外,还有诸如像:
-
@ToString
:为类自动生成toString()方法 -
@EqualsAndHashCode
:为类自动生成hashCode和equals实现 -
@Log
:为类自动生成log日志记录 -
@Synchronized
:为类方法或实例方法自动生成synchronized保护
等工具也是非常好用的,大家可以尝试在项目里用起来。
从此,代码5分钟,划水2小时不是梦。。。
每天进步一点点!Peace!
2020.01.08晚
给个[在看],是对程序羊最大的支持