1. 程式人生 > >深入理解Lombok

深入理解Lombok

說道Lombok,可能會鮮為人知。但是在實際的開發中,它起到了很大的作用,話不多說,直入正題:

一、Lombok是什麼

    現在看一下Lombok官方對其進行的解釋:Lombok官網:https://projectlombok.org

第一句話,Lombok專案是一種自動接通你的編輯器和構建工具的一個Java庫。接著,不用再一次寫額外的getter或者equals方法。翻譯到這裡其實就可以,後面是對Lombok早期應用的介紹。通過這兩句話不難理解lombok其實就是幫助我們編寫getter或者equals方法的一個“工具”。其實他的魅力並不在於幫助我們簡單的編寫對應的getter或者更多的方法,還有一點在於,當我們的欄位發生改變時,lombok也會對相應的getter方法進行改變。

二、為什麼要在自己的專案中使用Lombok

   要回答這個問題,僅僅知道什麼是Lombok是不夠的。在講解原理之前我想再提一點 ,這也是為什麼要使用Lombok的關鍵所在:根據Lombok的使用規則,如果想要使用Lombok就需要刪除在專案中(JavaBean)存在的已經生成的getter方法setter方法以及equals和hash方法,當然Lombok也提供了對列印日誌的處理。這樣在使用Lombok以後就會大大減少專案中的程式碼量,同時由於Lombok有自動修改的功能,這也提供了專案中程式碼的執行效率。

   綜上所述,使用Lombok的兩點主要原因就是:

        (1)、簡化冗餘的JavaBean程式碼;

        (2)、大大提高JavaBean中方法的執行效率;

三、如何使用LomBok

    在Lombok的官網中,有一個install選項,我們點開它會看到多種安裝方式:

大家可以根據自己的專案需求來選擇使用哪種方式,這裡以Maven為例:

點選Maven會看到一組座標:

      

根據它的提示我們將這一組座標新增到我們的pom檔案中:

        

新增進去以後點選import change,等待Idea把jar包下載完就可以在專案中使用了。

四、Lombok實現原理

    Lombok實現了JSR 269 API規範,javac在Java6開始支援這一規範,只要程式實現了該API,就能在javac執行的時候得到呼叫,那麼Lombok在編譯時使用的就是javac,具體流程如下:

首先是專案的原始碼檔案,在經過編譯處理以後,lombok會使用自己的抽象語法樹去進行註解的匹配,如果在專案中的某一個類中使用了lombok中的註解,那麼註解編譯器就會自動去匹配專案中的註解對應到在lombok語法樹中的註解檔案,並經過自動編譯匹配來生成對應類中的getter或者setter方法,達到簡化程式碼的目的。執行順序就如上圖的疊放順序。

五、Lombok註解詳解

   Lombok主要常用的註解有:@Data,@getter,@setter,@NoArgsConstructor,@AllArgsConstructor,@ToString,@EqualsAndHashCode,@Slf4j,@Log4j。我們一個一個來看:

@Data註解:在JavaBean或類JavaBean中使用,這個註解包含範圍最廣,它包含getter、setter、NoArgsConstructor註解,即當使用當前註解時,會自動生成包含的所有方法;

@getter註解:在JavaBean或類JavaBean中使用,使用此註解會生成對應的getter方法;

@setter註解:在JavaBean或類JavaBean中使用,使用此註解會生成對應的setter方法;

@NoArgsConstructor註解:在JavaBean或類JavaBean中使用,使用此註解會生成對應的無參構造方法;

@AllArgsConstructor註解:在JavaBean或類JavaBean中使用,使用此註解會生成對應的有參構造方法;

@ToString註解:在JavaBean或類JavaBean中使用,使用此註解會自動重寫對應的toStirng方法;

@EqualsAndHashCode註解:在JavaBean或類JavaBean中使用,使用此註解會自動重寫對應的equals方法和hashCode方法;

@Slf4j:在需要列印日誌的類中使用,當專案中使用了slf4j列印日誌框架時使用該註解,會簡化日誌的列印流程,只需呼叫info方法即可;

@Log4j:在需要列印日誌的類中使用,當專案中使用了log4j列印日誌框架時使用該註解,會簡化日誌的列印流程,只需呼叫info方法即可;

在使用以上註解需要處理引數時,處理方法如下(以@ToString註解為例,其他註解同@ToString註解):

@ToString(exclude="column")

意義:排除column列所對應的元素,即在生成toString方法時不包含column引數;

@ToString(exclude={"column1","column2"})

意義:排除多個column列所對應的元素,其中間用英文狀態下的逗號進行分割,即在生成toString方法時不包含多個column引數;

@ToString(of="column")

意義:只生成包含column列所對應的元素的引數的toString方法,即在生成toString方法時只包含column引數;;

@ToString(of={"column1","column2"})

意義:只生成包含多個column列所對應的元素的引數的toString方法,其中間用英文狀態下的逗號進行分割,即在生成toString方法時只包含多個column引數;

六、使用Lombok可能需要注意的地方

    (1)、當你的IDE是Idea時,要注意你的Idea是支援Lombok的,如果不支援請更換2017版本嘗試。

   (2)、在使用Lombok時,你的編輯器可能會報錯,這時請在你的IDE中安裝Lombok外掛(如果使用的Idea則直接搜尋Lombok外掛,選擇星級最高的,直接安裝就是,其他Ide類同)。

   (3)、引數的處理往往都是根據專案需求來進行,請妥善處理引數。

   (4)、如果你無法訪問Lombok官網,你可以從這篇博文中將Maven座標照著自己打進去,或者你也可以訪問Maven的中央倉庫搜尋Lombok,將Maven座標複製進去即可。