当你在写Getter和Setter时,必定无数次的想过,为何会有POJO这么烂的东西。你不是一我的!(不是骂人…)无数的开发人员花费了大量的时间来写这种样板代码,而他们原本能够利用这些时间作出更有价值的输出。java
从我开始写Java以来,已经写了几千行代码了,其中大概50%都是样板代码,在转型以前,我就这么一直毫无怨言的写着。而最近两年,我再也不Java了,转而开始写一些Python,Go和JavaScript的代码。这时我才感受到Java中的重复的样板代码是多么使人沮丧。git
值得庆幸的是,如今的IDE为咱们提供了自动生成这些代码的功能。可是我仍然须要按快捷键或者点鼠标来操做,这是很是影响个人编码思路的。程序员
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 againgithub
上面这段话摘自Lombok的首页。这是一个每一个人都须要使用的库,简直是一种仙丹!开个玩笑。Java是一门很棒的语言,可是它的冗长常常会使人感到苦恼。编程
Lombok到底有多香呢?我总结了如下几点:bash
想了解更多Lombok特性的话,能够自行前往https://projectlombok.org/features/all查看。maven
Lombok是在Java注解处理器和几个编译时注解的帮助下工做的,它将注入额外的Java字节码来帮助咱们处理重复的代码。你能够查看它生成的Java代码,这一过程被幽默的称为“Delombokisation”。ide
Lombok引入了一个额外的编译时依赖。函数
若是你使用vanilla javac进行编译,你须要指定lombok.jar做为注解处理器:javac -cp lombok.jar MyCode.java
工具
若是你使用的是maven,那么须要在pom.xml中插入如下代码来保证你的代码可使用Lombok。
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
复制代码
若是你使用的是Gradle,那么你须要使用Gradle Lombok插件
plugins {
id 'io.franzbecker.gradle-lombok' version '1.14'
id 'java'
}
复制代码
从你开始使用Java起,你应该就开始使用一个智能的IDE来自动编译或给你的代码提供一些建议。为了将Lombok集成进IDE,你须要告诉Lombok io来安装合适的钩子。
获取Lombok的jar包后,执行java -jar lombok.jar
来完成全部的设置。
IntelliJ IDEA和Visual Studio用户须要一个单独的Lombok插件,你能够选择从插件库中安装。
talk is cheap, show me your code.程序员就应该拿代码说话。下面咱们就来看一个完整的例子。
为被注解的自动生成getXXX和setXXX方法。
import lombok.Getter;
import lombok.Setter;
class UptimeResponse {
// GetXXX and SetXXX are automatically generated
@Getter @Setter private long uptime;
@Getter @Setter private long currentTime;
@Getter @Setter private String status;
UptimeResponse() {
this.uptime = ManagementFactory
.getRuntimeMXBean().getUptime();
this.currentTime = System.currentTimeMillis();
this.status = "OK";
}
}
// So this works automagically
UptimeResponse res = new UptimeResponse();
res.setStatus("FAIL");
System.out.println(res.getUptime());
复制代码
能够自动建立默认的POJO构造函数,它将字段初始化为默认值。
import lombok.*
@AllArgsConstructor
class Document {
@Getter @Setter private String title;
@Getter @Setter private String content;
// ...
}
// This works automagically
Document d = new Document("Hello World", "Message Body");
d.getTitle(); // Hello World
d.getContent(); // Message Body
复制代码
Lombok能够生成的样板代码是包含局部变量的equals方法和hashcode方法。你能够手动排除一些字段。
import lombok.*;
@RequiredArgsConstructor
@EqualsAndHashCode
class User {
@Getter
private final String username;
@EqualsAndHashCode.Exclude
@Getter
@Setter
private String lastAction; // not required for equality checks
}
// This works automagically
User u1 = new User("amitosh");
u1.setLastAction("Hello");
User u2 = new User("amitosh");
u2.setLastAction("Compile");
u1.equals(u2) // Gives true
复制代码
Lombok的ToString注解自动生成toString方法,其中包含类封装的所有字段。这是用于生成调试表示的快速方法。
import lombok.ToString;
import lombok.Getter;
import lombok.Setter;
@ToString
class Entry {
@Getter @Setter private String id;
@Getter @Setter private String target;
}
// This works automagically
Entry e = new Entry();
// ...
System.out.println(e); // Nice output with values of id and target
复制代码
这个注解用于生成符合规范的完整POJO。它是ToString、EqualsAndHashCode以及全部非final字段的Getter和Setter的集合体。
import lombok.Data;
@Data
class Message {
private String sender;
private String content;
}
// This works automagically
Message m = new Message("amitosh", "Hello World");
m.setSender("agathver");
m.getContent(); // Hello World
m.toString(); // ...
复制代码
Java是一门静态检查语言,但有时检查会比较多余。例若有时咱们不关心异常,或者肯定代码中不会出现异常,因此就不想去写捕获和处理异常的代码。这时SneakyThrows注解能够帮助咱们一块儿骗过编译器。
但要注意不能滥用这个注解。
import lombok.SneakyThrows;
public class SneakyThrowsExample {
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
// This exception is never generated as UTF-8 is guaranteed
// to be supported by the JVM
return new String(bytes, "UTF-8");
}
}
复制代码
不是全部的工具都支持Lombok的,最著名的是JavaDoc工具。你须要有一个中间态的代码来使文档正确表示。此外,有时候你可能会想看看Lombok生成的代码究竟是什么样的。幸亏Lombok提供了“delomboking”,用来将Lombok转换成Java源代码。
要转换一个文件夹下的所有代码,可使用如下命令:
java -jar lombok.jar delombok src -d src-delomboked
复制代码
maven和gradle插件也包含了delomboking任务,在你须要的时候可使用。
Lombok是一个提升你的Java生产力的工具。我没法想象没有它时应该怎么写Java程序。真心但愿你在读完本文之后可以认识到它的强大!
Lombok是一款很是好用的工具,它能够帮助咱们快速构建POJO类。可是若是直接使用@Data注解时,会破坏类的封装特性。这点不符合面向对象编程的思想,但工做中会使用一些序列化工具,这些工具要求全部字段都要有setter方法。为了编码的方便,可能使用@Data方法是一个好的选择。