當(dāng)你在寫Getter和Setter時蜓堕,一定無數(shù)次的想過妹萨,為什么會有POJO這么爛的東西孵睬。你不是一個人Jぁ(不是罵人…)無數(shù)的開發(fā)人員花費(fèi)了大量的時間來寫這種樣板代碼牌芋,而他們本來可以利用這些時間做出更有價(jià)值的輸出。
從我開始寫Java以來松逊,已經(jīng)寫了幾千行代碼了躺屁,其中大概50%都是樣板代碼,在轉(zhuǎn)型之前经宏,我就這么一直毫無怨言的寫著犀暑。而最近兩年熄捍,我不再Java了,轉(zhuǎn)而開始寫一些Python母怜,Go和JavaScript的代碼余耽。這時我才感覺到Java中的重復(fù)的樣板代碼是多么令人沮喪。
值得慶幸的是苹熏,現(xiàn)在的IDE為我們提供了自動生成這些代碼的功能碟贾。但是我仍然需要按快捷鍵或者點(diǎn)鼠標(biāo)來操作,這是非常影響我的編碼思路的轨域。
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是一門很棒的語言,但是它的冗長經(jīng)常會令人感到苦惱枉长。
Lombok到底有多香呢冀续?我總結(jié)了以下幾點(diǎn):
- Getter和Setter注解會自動生成getter、setter方法
- NoArgsConstructor和AllArgConstructor可以幫助你快速生成構(gòu)造函數(shù)
- ToString會使POJO打印更加友好的日志
- Data會讓你的POJO成為一個完全符合規(guī)范的POJO
- SneakyThrows可以偷偷拋出檢查異常必峰,而不需要再寫throws子句
想了解更多Lombok特性的話洪唐,可以自行前往https://projectlombok.org/features/all查看。
Lombok是如何工作的吼蚁?
Lombok是在Java注解處理器和幾個編譯時注解的幫助下工作的凭需,它將注入額外的Java字節(jié)碼來幫助我們處理重復(fù)的代碼。你可以查看它生成的Java代碼肝匆,這一過程被幽默的稱為“Delombokisation”粒蜈。
我應(yīng)該如何開始使用?
Lombok引入了一個額外的編譯時依賴旗国。
如果你使用vanilla javac進(jìn)行編譯枯怖,你需要指定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'
}
設(shè)置你的IDE
從你開始使用Java起,你應(yīng)該就開始使用一個智能的IDE來自動編譯或給你的代碼提供一些建議借浊。為了將Lombok集成進(jìn)IDE,你需要告訴Lombok io來安裝合適的鉤子萝招。
獲取Lombok的jar包后蚂斤,執(zhí)行java -jar lombok.jar
來完成所有的設(shè)置。
IntelliJ IDEA和Visual Studio用戶需要一個單獨(dú)的Lombok插件槐沼,你可以選擇從插件庫中安裝曙蒸。
代碼拿來捌治!
talk is cheap, show me your code.程序員就應(yīng)該拿代碼說話。下面我們就來看一個完整的例子纽窟。
Getters和Setters
為被注解的自動生成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());
Constructors
可以自動創(chuàng)建默認(rèn)的POJO構(gòu)造函數(shù),它將字段初始化為默認(rèn)值臂港。
- NoArgConstructor創(chuàng)建一個無參構(gòu)造函數(shù)森枪,所有的字段都會初始化為默認(rèn)值
- AllArgsConstructor創(chuàng)建一個全參數(shù)構(gòu)造函數(shù),每個字段都會初始化為指定值
- RequiredArgsConstructor創(chuàng)建一個構(gòu)造函數(shù)审孽,參數(shù)包括所有final字段和標(biāo)記為NotNull的字段
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
Equals and hash codes
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
To String
Lombok的ToString注解自動生成toString方法佑力,其中包含類封裝的全部字段式散。這是用于生成調(diào)試表示的快速方法。
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
Data classes
這個注解用于生成符合規(guī)范的完整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(); // ...
SneakyThrows
Java是一門靜態(tài)檢查語言编饺,但有時檢查會比較多余揍移。例如有時我們不關(guān)心異常,或者確定代碼中不會出現(xiàn)異常反肋,所以就不想去寫捕獲和處理異常的代碼那伐。這時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");
}
}
Delomboking
不是所有的工具都支持Lombok的罕邀,最著名的是JavaDoc工具。你需要有一個中間態(tài)的代碼來使文檔正確表示养距。此外诉探,有時候你可能會想看看Lombok生成的代碼到底是什么樣的。幸好Lombok提供了“delomboking”棍厌,用來將Lombok轉(zhuǎn)換成Java源代碼肾胯。
要轉(zhuǎn)換一個文件夾下的全部代碼,可以使用以下命令:
java -jar lombok.jar delombok src -d src-delomboked
maven和gradle插件也包含了delomboking任務(wù)耘纱,在你需要的時候可以使用敬肚。
Lombok是一個提高你的Java生產(chǎn)力的工具。我無法想象沒有它時應(yīng)該怎么寫Java程序束析。真心希望你在讀完本文以后能夠認(rèn)識到它的強(qiáng)大艳馒!
原文地址
https://medium.com/@agathver/banish-repetitive-java-code-with-lombok-f9b97d0d4137
譯者點(diǎn)評
Lombok是一款非常好用的工具,它可以幫助我們快速構(gòu)建POJO類。但是如果直接使用@Data注解時弄慰,會破壞類的封裝特性第美。這點(diǎn)不符合面向?qū)ο缶幊痰乃枷耄ぷ髦袝褂靡恍┬蛄谢ぞ呗剿@些工具要求所有字段都要有setter方法什往。為了編碼的方便,可能使用@Data方法是一個好的選擇慌闭。