【譯】利用Lombok消除重復(fù)代碼

當(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):

  1. Getter和Setter注解會自動生成getter、setter方法
  2. NoArgsConstructor和AllArgConstructor可以幫助你快速生成構(gòu)造函數(shù)
  3. ToString會使POJO打印更加友好的日志
  4. Data會讓你的POJO成為一個完全符合規(guī)范的POJO
  5. 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)值臂港。

  1. NoArgConstructor創(chuàng)建一個無參構(gòu)造函數(shù)森枪,所有的字段都會初始化為默認(rèn)值
  2. AllArgsConstructor創(chuàng)建一個全參數(shù)構(gòu)造函數(shù),每個字段都會初始化為指定值
  3. 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方法是一個好的選擇慌闭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末别威,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贡必,更是在濱河造成了極大的恐慌兔港,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔拟,死亡現(xiàn)場離奇詭異衫樊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)利花,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門科侈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炒事,你說我怎么就攤上這事臀栈。” “怎么了挠乳?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵权薯,是天一觀的道長。 經(jīng)常有香客問我睡扬,道長盟蚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任卖怜,我火速辦了婚禮屎开,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘马靠。我一直安慰自己奄抽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布甩鳄。 她就那樣靜靜地躺著逞度,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娩贷。 梳的紋絲不亂的頭發(fā)上第晰,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音彬祖,去河邊找鬼茁瘦。 笑死,一個胖子當(dāng)著我的面吹牛储笑,可吹牛的內(nèi)容都是我干的甜熔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼突倍,長吁一口氣:“原來是場噩夢啊……” “哼腔稀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羽历,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焊虏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秕磷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诵闭,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年澎嚣,在試婚紗的時候發(fā)現(xiàn)自己被綠了疏尿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡易桃,死狀恐怖褥琐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晤郑,我是刑警寧澤敌呈,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站造寝,受9級特大地震影響磕洪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匹舞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一褐鸥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赐稽,春花似錦叫榕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至括丁,卻和暖如春荞下,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工尖昏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仰税,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓抽诉,卻偏偏與公主長得像陨簇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迹淌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容