當你在寫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方法是一個好的選擇。