聽說用 Lombok 可以早點下班竿拆?

聽說隔壁用 Lombok 的六點就下班了宙拉,我也想六點下班!

好的丙笋,那么這篇文章就介紹下什么是 Lombok谢澈,Lombok 做了什么以及 Lombok 是怎么做的

在介紹之前御板,先通過是否使用 Lombok 的效果來看下對比锥忿,首先來看下沒有 Lombok 之前,我們的一個簡單的 Java 對象(POJO)是長什么樣子的:

哦怠肋,我的天啊敬鬓,居然 60 行,好長霸钏啤列林!那我們接下來使用的 Lombok 來試下:

什么瑞你,只使用了 @Date 注解就可以實現(xiàn)之前 60 行的相同功能酪惭,代碼長度整整縮小了 3 倍,這么神奇的嘛者甲?那么讓我們走進 Lombok 吧春感!

什么是 Lombok?

下面是 Lombok 官網(wǎng)的簡介:

簡而言之就是 Lombok 是一個很方便的插件虏缸,本質(zhì)是個 Java 庫鲫懒,使用它通過相關(guān)注解就可以不用再編寫冗長的 getter 或者 equals 等方法了。

接下來講下 Lombok 實現(xiàn)的原理刽辙,這樣就知道為什么要這樣使用 Lombok 的注解了窥岩。

Lombok 實現(xiàn)原理

要講 Lombok 的實現(xiàn)原理,在此之前就需要來說下注解的兩種解析方式:運行時注解編譯時注解宰缤。

首先來看下運行時解析颂翼,比如 Spring 配置的 AOP 切面這些注解都是在程序運行的時候通過反射來獲取的注解值,但是只有在程序運行時才能獲取到這些注解值慨灭,導(dǎo)致運行時代碼效率很低朦乏,并且如果想在編譯階段利用這些注解來進行檢查,比如對用戶的不合理代碼作出錯誤報告氧骤,反射的方法就行不通了呻疹。

這就引出了第二種在編譯時解析,Lombok 工具就是運行在編譯時解析的筹陵。

那如何把注解與 Java 編譯器結(jié)合使用呢刽锤?Java 也提供了兩種解決方案:

第一種方案是注解處理器(Annotation Processing Tool)镊尺,它最早是在 JDK 1.5 與注解(Annotation) 一起引入的,它是一個命令行工具并思,能夠提供構(gòu)建時基于源代碼對程序結(jié)構(gòu)的讀取功能鹅心,能夠通過運行注解處理器來生成新的中間文件,進而影響編譯過程纺荧,不過它在 JDK 1.8 中被移除了旭愧,取而代之的是 JSR 269 插入式注解處理器(Pluggable Annotation Processing API),它是實現(xiàn)了 JSR 269 的機制宙暇,作為注解處理器的替代方案输枯。

我們通過一個流程圖來進一步說明注解處理器的工作原理:

首先寫完代碼后會調(diào)用 javac 編譯,在編譯后會生成抽象語法樹(AST)占贫,之后會調(diào)用插入式注解處理器處理桃熄,上面說了插入式注解處理器會修改語法樹,生成一些額外的代碼型奥,經(jīng)過處理器的處理語法樹會有變動瞳收,有變動之后,會再次到生成抽象語法樹的處理環(huán)節(jié)厢汹,將變動后的代碼再次生成抽象語法樹螟深,接著再通過注解處理器,如果這次語法樹沒有被修改烫葬,那么就會生成響應(yīng)的字節(jié)碼界弧,變成 class 文件,以上就是整個注解處理器在整個 javac 編譯源代碼生成 class 文件中起到的作用搭综。

在簡單了解了 Lombok 實現(xiàn)原理后垢箕,讓我們看下 Lombok 有哪些常見的注解:

Lombok 注解

下面是整理的常用的 Lombok 注解思維導(dǎo)圖:

右側(cè)上方的 @Getter、@Setter兑巾、@ToString条获、@EqualsAndHashCode 這幾個名字大家都不陌生,無非就是幫我們生成對應(yīng)的方法蒋歌,這四個注解的總和也就是剛開始用的注解 @Data帅掘,這些注解都?xì)w結(jié)為常見方法的注解。

右側(cè)下方的 @AllArgsConstructor奋姿、@RequiredArgsConstructor锄开、@NoArgsConstructor 分別為全參構(gòu)造函數(shù)、必須參數(shù)構(gòu)造函數(shù)称诗、無參構(gòu)造函數(shù)萍悴,它們通常為構(gòu)造方法的注解。

左側(cè)的 @NonNull 會自動生成空值校驗;@CleanUp 會自動調(diào)用變量的 close 方法釋放資源癣诱;@Builder 會自動生成構(gòu)造者模式计维,方便對屬性 set/get 操作; @Synchronized 會自動生成同步鎖撕予;@SneakyThrows 會自動生成 try/catch 捕捉異常鲫惶;@Slf4j 是日志相關(guān)的,會自動為類添加日志支持实抡。

以上就是 Lombok 為我們提供的比較常用的注解欠母。

Lombok 使用

首先需要安裝 Lombok 插件,我在這里是以 IDEA 2019.3.1 版本來演示的:

安裝 Lombok 插件

點擊 File->Settings->Plugins吆寨,搜索 Lombok赏淌,然后點擊安裝 Lombok 插件:

在安裝完插件后重啟 IDEA,到此 Lombok 插件就安裝完成了啄清,接下來就要進行實踐演示了:

Lombok 常用注解演示

首先在 pom 文件中引入依賴:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

其中 <scope>provided</scope> 表示 jar 包是運行在編譯時的六水,當(dāng)程序編譯成 class 源代碼后,這個 jar 包就不會在源代碼層面有所體現(xiàn)辣卒。

接下來演示 Lombok 注解使用方式掷贾,并通過查看編譯后 class 文件,理解其工作原理荣茫,在這里以 @Getter 注解為例:

首先創(chuàng)建一個 GetterDemo 類想帅,其中有 nameage 兩個字段。

package com.wupx.lombok;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NonNull;

public class GetterDemo {

    @Getter(value = AccessLevel.PRIVATE, onMethod_ = {@NonNull})
    private String age;

    @Getter(lazy = true)
    private final String name = "wupx";
}

我們在變量 age 上加上注解 @Getter计露,并且加上了參數(shù)來設(shè)置訪問級別博脑,通過 onMethod_ 參數(shù)可以為我們在生成的 getAge 方法添加上其他注解憎乙,比如 @NonNull票罐;在 name 上加上 @Getter 注解,并加上 lazy 參數(shù)并設(shè)為 true泞边,表示開啟懶加載该押。

接下來編譯下,編譯的 class 源代碼如下:

package com.wupx.lombok;

import java.util.concurrent.atomic.AtomicReference;
import lombok.NonNull;

public class GetterDemo {
    private String age;
    private final AtomicReference<Object> name = new AtomicReference();

    public GetterDemo() {
    }

    @NonNull
    private String getAge() {
        return this.age;
    }

    public String getName() {
        Object value = this.name.get();
        if (value == null) {
            synchronized(this.name) {
                value = this.name.get();
                if (value == null) {
                    String actualValue = "wupx";
                    value = "wupx" == null ? this.name : "wupx";
                    this.name.set(value);
                }
            }
        }

        return (String)((String)(value == this.name ? null : value));
    }
}

可以發(fā)現(xiàn)生成后的源代碼文件中阵谚,getAge 方法訪問修飾符為 private蚕礼,并且方法上有一個 @NonNull 的注解;getName 方法沒有剛開始就初始化一個字符串梢什,而是只有調(diào)用該方法的時候判斷該字段是否為空奠蹬,若為空,則初始化一個字符串并返回嗡午,這樣就可以為開銷大的初始化操作做一個懶加載囤躁,只有當(dāng)使用的時候才會主動加載這個字段。

其他的注解方法大家可以自己去實踐操作下。

Lombok 優(yōu)缺點

在了解完 Lombok 之后狸演,讓我們來分析下 Lombok 的優(yōu)缺點吧言蛇!

Lombok 的優(yōu)點有以下幾點:

  • 通過注解自動生成樣板代碼,提高開發(fā)效率
  • 代碼簡潔宵距,只關(guān)注相關(guān)屬性
  • 新增屬性后腊尚,無需刻意修改相關(guān)方法

但是 Lombok 也有一些缺點:

  • 降低了源代碼的可讀性和完整性
  • 加大對問題排查的難度(可能問題定位到不存在的行,無從下手)
  • 強 x 隊友满哪,因為需要 IDE 的相關(guān)插件的支持

總結(jié)

本文介紹了什么是 Lombok婿斥,Lombok 做了什么以及 Lombok 的實現(xiàn)原理,并且分析了 Lombok 的利弊哨鸭,大家在享受到它的好處的同時受扳,也應(yīng)該考慮到它帶來的一些問題,你在工作中有被隊友強 x 嗎兔跌?你對 Lombok 怎么看勘高?歡迎留言談?wù)摚?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坟桅,隨后出現(xiàn)的幾起案子华望,更是在濱河造成了極大的恐慌,老刑警劉巖仅乓,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖舟,死亡現(xiàn)場離奇詭異,居然都是意外死亡夸楣,警方通過查閱死者的電腦和手機宾抓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豫喧,“玉大人石洗,你說我怎么就攤上這事〗粝裕” “怎么了讲衫?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孵班。 經(jīng)常有香客問我涉兽,道長,這世上最難降的妖魔是什么篙程? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任枷畏,我火速辦了婚禮,結(jié)果婚禮上虱饿,老公的妹妹穿的比我還像新娘拥诡。我一直安慰自己丹允,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布袋倔。 她就那樣靜靜地躺著雕蔽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宾娜。 梳的紋絲不亂的頭發(fā)上批狐,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音前塔,去河邊找鬼嚣艇。 笑死,一個胖子當(dāng)著我的面吹牛华弓,可吹牛的內(nèi)容都是我干的食零。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寂屏,長吁一口氣:“原來是場噩夢啊……” “哼贰谣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迁霎,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吱抚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后考廉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘豹,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年昌粤,在試婚紗的時候發(fā)現(xiàn)自己被綠了既绕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涮坐,死狀恐怖凄贩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膊升,我是刑警寧澤怎炊,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站廓译,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏债查。R本人自食惡果不足惜非区,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹廷。 院中可真熱鬧征绸,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渤弛,卻和暖如春祝拯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背她肯。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工佳头, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晴氨。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓康嘉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親籽前。 傳聞我的和親對象是個殘疾皇子亭珍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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