您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中Lombok的使用詳解”,在日常操作中,相信很多人在Java中Lombok的使用詳解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java中Lombok的使用詳解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
前言
在 Java 應(yīng)用程序中存在許多重復(fù)相似的、生成之后幾乎不對(duì)其做更改的代碼,但是我們還不得不花費(fèi)很多精力編寫它們來(lái)滿足 Java 的編譯需求
比如,在 Java 應(yīng)用程序開發(fā)中,我們幾乎要為所有 Bean 的成員變量添加 get() ,set() 等方法,這些相對(duì)固定但又不得不編寫的代碼浪費(fèi)程序員很多精力,同時(shí)讓類內(nèi)容看著更雜亂,我們希望將有限的精力關(guān)注在更重要的地方。
Lombok 已經(jīng)誕生很久了,甚至在 Spring Boot Initalizr 中都已加入了 Lombok 選項(xiàng),
這里我們將 Lombok 做一下詳細(xì)說(shuō)明:
Lombok
官網(wǎng)的介紹: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. Early access to future java features such as val, and much more.
直白的說(shuō): Lombok 是一種 Java™ 實(shí)用工具,可用來(lái)幫助開發(fā)人員消除 Java 的冗長(zhǎng),尤其是對(duì)于簡(jiǎn)單的 Java 對(duì)象(POJO)。它通過(guò)注解實(shí)現(xiàn)這一目的,且看:
Bean 的對(duì)比
傳統(tǒng)的 POJO 類是這樣的
通過(guò)Lombok改造后的 POJO 類是這樣的
一眼可以觀察出來(lái)我們?cè)诰帉?Employee 這個(gè)類的時(shí)候通過(guò) @Data 注解就已經(jīng)實(shí)現(xiàn)了所有成員變量的 get() 與 set() 方法等,同時(shí) Employee 類看起來(lái)更加清晰簡(jiǎn)潔。Lombok 的神奇之處不止這些,豐富的注解滿足了我們開發(fā)的多數(shù)需求。
Lombok的安裝
查看下圖,@Data的實(shí)現(xiàn),我們發(fā)現(xiàn)這個(gè)注解是應(yīng)用在編譯階段的
這和我們大多數(shù)使用的注解,如 Spring 的注解(在運(yùn)行時(shí),通過(guò)反射來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯)是有很大差別的,如Spring 的@RestController 注解
一個(gè)更直接的體現(xiàn)就是,普通的包在引用之后一般的 IDE 都能夠自動(dòng)識(shí)別語(yǔ)法,但是 Lombok 的這些注解,一般的 IDE 都無(wú)法自動(dòng)識(shí)別,因此如果要使用 Lombok 的話還需要配合安裝相應(yīng)的插件來(lái)支持 IDE 的編譯,防止IDE 的自動(dòng)檢查報(bào)錯(cuò),下面以 IntelliJ IDEA 舉例安裝插件。
在Repositories中搜索Lombok,安裝后重啟IDE即可
在Maven或Gradle工程中添加依賴
至此我們就可以應(yīng)用 Lombok 提供的注解干些事情了。
Lombok注解詳解
Lombok官網(wǎng)提供了許多注解,但是 “勁酒雖好,可不要貪杯哦”,接下來(lái)逐一講解官網(wǎng)推薦使用的注解(有些注解和原有Java編寫方式?jīng)]太大差別的也沒有在此處列舉,如@ Synchronized等)
@Getter和@Setter
該注解可應(yīng)用在類或成員變量之上,和我們預(yù)想的一樣,@Getter 和 @Setter 就是為成員變量自動(dòng)生成 get 和 set 方法,默認(rèn)生成訪問(wèn)權(quán)限為 public 方法,當(dāng)然我們也可以指定訪問(wèn)權(quán)限 protected 等,如下圖:
成員變量name指定生成set方法,并且訪問(wèn)權(quán)限為protected;boolean類型的成員變量 female 只生成get方法,并修改方法名稱為 isFemale()。當(dāng)把該注解應(yīng)用在類上,默認(rèn)為所有非靜態(tài)成員變量生成 get 和 set 方法,也可以通過(guò) AccessLevel.NONE 手動(dòng)禁止生成get或set方法,如下圖:
@ToString
該注解需應(yīng)用在類上,為我們生成 Object 的 toString 方法,而該注解里面的幾個(gè)屬性能更加豐富我們想要的內(nèi)容, exclude 屬性禁止在 toString 方法中使用某字段,而of屬性可以指定需要使用的字段,如下圖:
查看編譯后的Employee.class得到我們預(yù)期的結(jié)果,如下圖
@EqualsAndHashCode
該注解需應(yīng)用在類上,使用該注解,lombok會(huì)為我們生成 equals(Object other) 和 hashcode() 方法,包括所有非靜態(tài)屬性和非transient的屬性,同樣該注解也可以通過(guò) exclude 屬性排除某些字段,of 屬性指定某些字段,也可以通過(guò) callSuper 屬性在重寫的方法中使用父類的字段,這樣我們可以更靈活的定義bean的比對(duì),如下圖:
查看編譯后的Employee.class文件,如下圖:
@NonNull
該注解需應(yīng)用在方法或構(gòu)造器的參數(shù)上或?qū)傩陨希脕?lái)判斷參數(shù)的合法性,默認(rèn)拋出 NullPointerException 異常
查看NonNullExample.class文件,會(huì)為我們拋出空指針異常,如下圖:
當(dāng)然我們可以通過(guò)指定異常類型拋出其他異常,lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] , 為實(shí)現(xiàn)此功能我們需要在項(xiàng)目的根目錄新建lombok.config文件:
重新編譯NonNullExample類,已經(jīng)為我們拋出非法參數(shù)異常:
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
以上三個(gè)注解分別為我們生成無(wú)參構(gòu)造器,指定參數(shù)構(gòu)造器和包含所有參數(shù)的構(gòu)造器,默認(rèn)情況下,@RequiredArgsConstructor, @AllArgsConstructor 生成的構(gòu)造器會(huì)對(duì)所有標(biāo)記 @NonNull 的屬性做非空校驗(yàn)。
無(wú)參構(gòu)造器很好理解,我們主要看看后兩種,先看 @RequiredArgsConstructor
從上圖中我們可以看出, @RequiredArgsConstructor 注解生成有參數(shù)構(gòu)造器時(shí)只會(huì)包含有 final 和 @NonNull 標(biāo)識(shí)的 field,同時(shí)我們可以指定 staticName 通過(guò)生成靜態(tài)方法來(lái)構(gòu)造對(duì)象
查看Employee.class文件
當(dāng)我們把 staticName 屬性去掉我們來(lái)看遍以后的文件:
相信你已經(jīng)注意到細(xì)節(jié)
@AllArgsConstructor 就更簡(jiǎn)單了,請(qǐng)大家自行查看吧
@Data
介紹了以上的注解,再來(lái)介紹 @Data 就非常容易懂了,@Data 注解應(yīng)用在類上,是@ToString, @EqualsAndHashCode, @Getter / @Setter 和 @RequiredArgsConstructor合力的體現(xiàn),如下圖:
@Builder
函數(shù)式編程或者說(shuō)流式的操作越來(lái)越流行,應(yīng)用在大多數(shù)語(yǔ)言中,讓程序更具更簡(jiǎn)介,可讀性更高,編寫更連貫,@Builder就帶來(lái)了這個(gè)功能,生成一系列的builder API,該注解也需要應(yīng)用在類上,看下面的例子就會(huì)更加清晰明了。
編譯后的Employee.class文件如下:
媽媽再也不用擔(dān)心我 set 值那么麻煩了,流式操作搞定:
@Log
該注解需要應(yīng)用到類上,在編寫服務(wù)層,需要添加一些日志,以便定位問(wèn)題,我們通常會(huì)定義一個(gè)靜態(tài)常量Logger,然后應(yīng)用到我們想日志的地方,現(xiàn)在一個(gè)注解就可以實(shí)現(xiàn):
查看class文件,和我們預(yù)想的一樣:
Log有很多變種,CommonLog,Log4j,Log4j2,Slf4j等,lombok依舊良好的通過(guò)變種注解做良好的支持:
我實(shí)際使用的是 @Slf4j 注解
val
熟悉 Javascript 的同學(xué)都知道,var 可以定義任何類型的變量,而在 java 的實(shí)現(xiàn)中我們需要指定具體變量的類型,而 val 讓我們擺脫指定,編譯之后就精準(zhǔn)匹配上類型,默認(rèn)是 final 類型,就像 java8 的函數(shù)式表達(dá)式,()->System.out.println(“hello lombok”); 就可以解析到Runnable函數(shù)式接口。
查看解析后的class文件:
@Cleanup
當(dāng)我們對(duì)流進(jìn)行操作,我們通常需要調(diào)用 close 方法來(lái)關(guān)閉或結(jié)束某資源,而 @Cleanup 注解可以幫助我們調(diào)用 close 方法,并且放到 try/finally 處理塊中,如下圖:
編譯后的class文件如下,我們發(fā)現(xiàn)被try/finally包圍處理,并調(diào)用了流的close方法
其實(shí)在 JDK1.7 之后就有了 try-with-resource,不用我們顯式的關(guān)閉流,這個(gè)請(qǐng)大家自行看吧
總結(jié)
Lombok的基本操作流程是這樣的:
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
定義編譯期的注解
利用JSR269 api(Pluggable Annotation Processing API )創(chuàng)建編譯期的注解處理器
利用tools.jar的javac api處理AST(抽象語(yǔ)法樹)
將功能注冊(cè)進(jìn)jar包
Lombok 當(dāng)然還有很多注解,我推薦使用以上就足夠了,這個(gè)工具是帶來(lái)便利的,而不能被其捆綁,“弱水三千只取一瓢飲,代碼千萬(wàn)需抓重點(diǎn)看”,Lombok 能讓我更加專注有效代碼排除意義微小的障眼代碼(get,set等),另外Lombok生成的代碼還能像使用工具類一樣方便(@Builder)。
到此,關(guān)于“Java中Lombok的使用詳解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。