Lombok初探
官网的介绍:
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.
知乎的介绍:
Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。
换言之,就是lombok通过编译时修改AST(这个是javac标准允许的)达到各种奇奇怪怪的目的,是一套可以充分解放你双手,并且可以提升代码逼格的工具类,其酸爽程度不亚于guava。
下面结合几个例子来说明。
使用场景
1、对于一个简单的实体类,我们一般需要对每一个变量编写getter/setter
方法以及类的toString
方法,甚至有时候还需要编写equals
和hashCode
方法,当我们开发一个工程时,一般会有大量的实体类,带来的编码量是很巨大的,虽然IntellJ等常用的IDE可以自动生成这些方法,但看着那一坨代码,总归是不太爽的。
// 使用lombok
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.EqualsAndHashCode;
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class User {
private Integer id;
private String name;
private String phone;
}
当然,也可以简单粗暴的使用@Data
,它默认包含了以上几个注解。
2、除了基本的getter/setter
方法,lombok还可以通过@NoArgsConstructor
、@AllArgsConstructor
、@RequiredArgsConstructor
等注解直接生成构造方法。少年,如果你有过频繁修改实例变量,又频繁重新生成构造方法的经历,你会感激我的。
3、先来看下面这个使用了构建者模式的类。
// 一般写法
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class BuilderExample {
private String name;
private int age;
private Set<String> occupations;
BuilderExample(String name, int age, Set<String> occupations) {
this.name = name;
this.age = age;
this.occupations = occupations;
}
public static BuilderExampleBuilder builder() {
return new BuilderExampleBuilder();
}
public static class BuilderExampleBuilder {
private String name;
private int age;
private Set<String> occupations;
BuilderExampleBuilder() {
}
public BuilderExampleBuilder name(String name) {
this.name = name;
return this;
}
public BuilderExampleBuilder age(int age) {
this.age = age;
return this;
}
public BuilderExampleBuilder occupation(String occupation) {
if (this.occupations == null) {
this.occupations = new HashSet<String>();
}
this.occupations.add(occupation);
return this;
}
public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
if (this.occupations == null) {
this.occupations = new HashSet<String>();
}
this.occupations.addAll(occupations);
return this;
}
public BuilderExampleBuilder clearOccupations() {
if (this.occupations != null) {
this.occupations.clear();
}
return this;
}
public BuilderExample build() {
return new BuilderExample(name, age, occupations);
}
}
}
使用@Builder
注释能够自动生成复杂的构建器API。
// 使用lombok注解的写法
import lombok.Builder;
import lombok.Singular;
import java.util.Set;
@Builder
public class BuilderExample {
private String name;
private int age;
@Singular private Set<String> occupations;
}
😱……惊不惊喜?意不意外?
4、再来看一个魔性的例子:使用输入输出流拷贝两个文件。先给你5秒钟想一下常规写法(记得关闭文件流)。
5…
4…
3…
2…
1…
下面看一下使用lombok的写法。
public static void copyFile(String fromFile, String toFile) throws IOException {
@Cleanup InputStream in = new FileInputStream(fromFile);
@Cleanup OutputStream out = new FileOutputStream(toFile);
byte[] b = new byte[4096];
int n = -1;
while ((n = in.read(b)) != -1) {
out.write(b, 0, n);
}
}
相当于try-with-resource写法,但代码整洁多了有没有?
5、终于说到日志了。通过@Slf4j
注解,能够自动添加logger变量,释放了每个类中都需要编写的private static final Logger LOGGER = LoggerFactory.getterLogger($clazz$.class)
代码。当然,类似的注解还有@Log
、@Log4j
、@Log4j2
等。
该工具还有大量其他注解,可通过查看官方文档探索更多内容。
如何使用
1、如果你的项目是一个maven工程,需要在pom.xml
中加入对lombok类库的依赖,并将maven-compiler-plugin升至3.3版本及以上。
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
</plugin>
</plugins>
</build>
另外还支持gradle
、ant
、kobalt
等构建工具,具体方法请自行百度或参考官方说明。
2、如果你用IDE开发(废话),那么需要安装Lombok Plugin,目前支持IntellJ
、Eclipse
、Netbeans
、MyEclipse
、Spring Tool Suite
、JBoss Developer Studio
、Visual Studio Code
等IDE工具,具体方法请自行百度或参考官方说明。