Lombok 使用詳解,簡化Java編程

Lombok 使用詳解,簡化Java編程
前言
在 Java 應用程序中存在許多重複類似的、生成以後幾乎不對其作更改的代碼,可是咱們還不得不花費不少精力編寫它們來知足 Java 的編譯需求java

好比,在 Java 應用程序開發中,咱們幾乎要爲全部 Bean 的成員變量添加 get() ,set() 等方法,這些相對固定但又不得不編寫的代碼浪費程序員不少精力,同時讓類內容看着更雜亂,咱們但願將有限的精力關注在更重要的地方。
Lombok 使用詳解,簡化Java編程程序員

Lombok 已經誕生好久了,甚至在 Spring Boot Initalizr 中都已加入了 Lombok 選項,
Lombok 使用詳解,簡化Java編程編程

這裏咱們將 Lombok 作一下詳細說明:api

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. Early access to future java features such as val, and much more.ide

直白的說: Lombok 是一種 Java™ 實用工具,可用來幫助開發人員消除 Java 的冗長,尤爲是對於簡單的 Java 對象(POJO)。它經過註解實現這一目的,且看:函數式編程

Bean 的對比
傳統的 POJO 類是這樣的
Lombok 使用詳解,簡化Java編程函數

經過Lombok改造後的 POJO 類是這樣的工具

Lombok 使用詳解,簡化Java編程
一眼能夠觀察出來咱們在編寫 Employee 這個類的時候經過 @Data 註解就已經實現了全部成員變量的 get() 與 set()方法等,同時 Employee 類看起來更加清晰簡潔。Lombok 的神奇之處不止這些,豐富的註解知足了咱們開發的多數需求。性能

Lombok的安裝br/>查看下圖,@Data的實現,咱們發現這個註解是應用在編譯階段的
Lombok 使用詳解,簡化Java編程ui

這和咱們大多數使用的註解,如 Spring 的註解(在運行時,經過反射來實現業務邏輯)是有很大差異的,如Spring 的@RestController 註解

Lombok 使用詳解,簡化Java編程
一個更直接的體現就是,普通的包在引用以後通常的 IDE 都可以自動識別語法,可是 Lombok 的這些註解,通常的 IDE 都沒法自動識別,所以若是要使用 Lombok 的話還須要配合安裝相應的插件來支持 IDE 的編譯,防止IDE 的自動檢查報錯,下面以 IntelliJ IDEA 舉例安裝插件。

在Repositories中搜索Lombok,安裝後重啓IDE便可
Lombok 使用詳解,簡化Java編程

在Maven或Gradle工程中添加依賴
Lombok 使用詳解,簡化Java編程

至此咱們就能夠應用 Lombok 提供的註解幹些事情了。

Lombok註解詳解
Lombok官網提供了許多註解,可是 「勁酒雖好,可不要貪杯哦」,接下來逐一講解官網推薦使用的註解(有些註解和原有Java編寫方式沒太大差異的也沒有在此處列舉,如@ Synchronized等)
Lombok 使用詳解,簡化Java編程

@Getter和@Setter
該註解可應用在類或成員變量之上,和咱們預想的同樣,@Getter 和 @Setter 就是爲成員變量自動生成 get 和 set 方法,默認生成訪問權限爲 public 方法,固然咱們也能夠指定訪問權限 protected 等,以下圖:
Lombok 使用詳解,簡化Java編程

成員變量name指定生成set方法,而且訪問權限爲protected;boolean類型的成員變量 female 只生成get方法,並修改方法名稱爲 isFemale()。當把該註解應用在類上,默認爲全部非靜態成員變量生成 get 和 set 方法,也能夠經過 AccessLevel.NONE 手動禁止生成get或set方法,以下圖:
Lombok 使用詳解,簡化Java編程

@ToString
該註解需應用在類上,爲咱們生成 Object 的 toString 方法,而該註解裏面的幾個屬性能更加豐富咱們想要的內容, exclude 屬性禁止在 toString 方法中使用某字段,而of屬性能夠指定須要使用的字段,以下圖:

Lombok 使用詳解,簡化Java編程

查看編譯後的Employee.class獲得咱們預期的結果,以下圖
Lombok 使用詳解,簡化Java編程

@EqualsAndHashCode
該註解需應用在類上,使用該註解,lombok會爲咱們生成 equals(Object other) 和 hashcode() 方法,包括全部非靜態屬性和非transient的屬性,一樣該註解也能夠經過 exclude 屬性排除某些字段,of 屬性指定某些字段,也能夠經過 callSuper 屬性在重寫的方法中使用父類的字段,這樣咱們能夠更靈活的定義bean的比對,以下圖:
Lombok 使用詳解,簡化Java編程

查看編譯後的Employee.class文件,以下圖:
Lombok 使用詳解,簡化Java編程

@NonNull
該註解需應用在方法或構造器的參數上或屬性上,用來判斷參數的合法性,默認拋出 NullPointerException 異常
Lombok 使用詳解,簡化Java編程

查看NonNullExample.class文件,會爲咱們拋出空指針異常,以下圖:
Lombok 使用詳解,簡化Java編程

固然咱們能夠經過指定異常類型拋出其餘異常,lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] , 爲實現此功能咱們須要在項目的根目錄新建lombok.config文件:
Lombok 使用詳解,簡化Java編程

從新編譯NonNullExample類,已經爲咱們拋出非法參數異常:
Lombok 使用詳解,簡化Java編程

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
以上三個註解分別爲咱們生成無參構造器,指定參數構造器和包含全部參數的構造器,默認狀況下,@RequiredArgsConstructor, @AllArgsConstructor 生成的構造器會對全部標記 @NonNull 的屬性作非空校驗。

無參構造器很好理解,咱們主要看看後兩種,先看 @RequiredArgsConstructor

Lombok 使用詳解,簡化Java編程
從上圖中咱們能夠看出, @RequiredArgsConstructor 註解生成有參數構造器時只會包含有 final 和 @NonNull 標識的 field,同時咱們能夠指定 staticName 經過生成靜態方法來構造對象

查看Employee.class文件
Lombok 使用詳解,簡化Java編程

當咱們把 staticName 屬性去掉咱們來看遍之後的文件:

Lombok 使用詳解,簡化Java編程
相信你已經注意到細節

@AllArgsConstructor 就更簡單了,請你們自行查看吧

@Data
介紹了以上的註解,再來介紹 @Data 就很是容易懂了,@Data 註解應用在類上,是@ToString, @EqualsAndHashCode, @Getter / @Setter 和 @RequiredArgsConstructor協力的體現,以下圖:
Lombok 使用詳解,簡化Java編程

@Builder
函數式編程或者說流式的操做愈來愈流行,應用在大多數語言中,讓程序更具更簡介,可讀性更高,編寫更連貫,@Builder就帶來了這個功能,生成一系列的builder API,該註解也須要應用在類上,看下面的例子就會更加清晰明瞭。

Lombok 使用詳解,簡化Java編程

編譯後的Employee.class文件以下:
Lombok 使用詳解,簡化Java編程

媽媽不再用擔憂我 set 值那麼麻煩了,流式操做搞定:
Lombok 使用詳解,簡化Java編程

@Log
該註解須要應用到類上,在編寫服務層,須要添加一些日誌,以便定位問題,咱們一般會定義一個靜態常量Logger,而後應用到咱們想日誌的地方,如今一個註解就能夠實現:

Lombok 使用詳解,簡化Java編程
查看class文件,和咱們預想的同樣:

Lombok 使用詳解,簡化Java編程

Log有不少變種,CommonLog,Log4j,Log4j2,Slf4j等,lombok依舊良好的經過變種註解作良好的支持:
Lombok 使用詳解,簡化Java編程

我實際使用的是 @Slf4j 註解

val
熟悉 Javascript 的同窗都知道,var 能夠定義任何類型的變量,而在 java 的實現中咱們須要指定具體變量的類型,而 val 讓咱們擺脫指定,編譯以後就精準匹配上類型,默認是 final 類型,就像 java8 的函數式表達式,()->System.out.println(「hello lombok」); 就能夠解析到Runnable函數式接口。

Lombok 使用詳解,簡化Java編程
查看解析後的class文件:
Lombok 使用詳解,簡化Java編程

@Cleanup
當咱們對流進行操做,咱們一般須要調用 close 方法來關閉或結束某資源,而 @Cleanup 註解能夠幫助咱們調用 close 方法,而且放到 try/finally 處理塊中,以下圖:
Lombok 使用詳解,簡化Java編程

編譯後的class文件以下,咱們發現被try/finally包圍處理,並調用了流的close方法
Lombok 使用詳解,簡化Java編程

其實在 JDK1.7 以後就有了 try-with-resource,不用咱們顯式的關閉流,這個請你們自行看吧

總結

  • Lombok的基本操做流程是這樣的:
  • 定義編譯期的註解
  • 利用JSR269 api(Pluggable Annotation Processing API )建立編譯期的註解處理器
  • 利用tools.jar的javac api處理AST(抽象語法樹)
  • 將功能註冊進jar包

Lombok 使用詳解,簡化Java編程

Lombok 固然還有不少註解,我推薦使用以上就足夠了,這個工具是帶來便利的,而不能被其捆綁,「弱水三千只取一瓢飲,代碼千萬需抓重點看」,Lombok 能讓我更加專一有效代碼排除意義微小的障眼代碼(get,set等),另外Lombok生成的代碼還能像使用工具類同樣方便(@Builder)。

更多內容請查看官網:https://www.projectlombok.org/

靈魂追問

  1. 爲何只有一個總體 @EqualsAndHashCode 註解?而不是 @Equals 和 @HashCode?這涉及到一個規範哦
  2. 若是把三種構造器方式同時應用又加上了 @Builder 註解,會發生什麼?
  3. 你的燈還亮着嗎?

Lombok 使用詳解,簡化Java編程

  • Java升級那麼快,多個版本如何靈活切換和管理?
  • 手把手教你定製標準 Spring Boot starter
  • JDK12 Collectors.teeing 功能真香
  • 如何避免死鎖,咱們有套路可循
  • 讀取Excel還用POI?試試這款開源工具

Lombok 使用詳解,簡化Java編程

Lombok 使用詳解,簡化Java編程

tan日拱一兵轉發在看也很贊喜歡做者

相關文章
相關標籤/搜索