IDEA上提升生產力的插件--lombok

在Java項目中,經常要寫大量的get,set,toString()等方法,尤其是類的屬性比較多時,比較浪費時間,這時候就推薦一個Intellij Idea上的一個神器Lombok。

Lombok使用方法

首先在Idea上安裝插件lombok如下圖所示:

IDEA上提升生產力的插件--lombok

IDEA安裝lombok插件

在項目中引入依賴,以Maven為例:

IDEA上提升生產力的插件--lombok

maven引入lombok依賴

這樣就準備就緒了,接下來可以在項目中使用lombok了。lombok主要是用註解的方法代替原來對象中需要手動實現的get,set,toString()等方法。當然不僅限於這些。

常用註解

常用註解如下圖所示:

IDEA上提升生產力的插件--lombok

lombok常用註解

changchangyyog

使用例子

定義一個簡單的Person類,如下所示:

IDEA上提升生產力的插件--lombok

Person類

調用方法:

IDEA上提升生產力的插件--lombok

Main方法

第3行代碼用於驗證註解@NoArgsConstructor是否生成無參構造函數;

第4行代碼用於驗證註解AllArgsConstructor是否生成包含全部參數的構造函數;

第5到8行說明@Builder註解可以自動生成建造者模式代碼,使得我們可以採用鏈式調用創建對象;

第9,10行調用了@Data生成的toString方法;

第11,12行調用了@Data生成的hashCode方法;

第13行調用了@Data生成的`euqals方法;

第14行是註解@Data附贈的一個方法,用於判斷某個對象是否屬於當前類的實例。

看下執行結果:

IDEA上提升生產力的插件--lombok

代碼執行結果

lombok中坑

第一個坑是關於@EqualsAndHashCode的。

對於沒有顯式的繼承父類且使用了@EqualsAndHashCode(callSuper = true) 註解的類,這個類由lombok生成的equals()方法只有當兩個對象是同一個對象時才會返回true,不是同一個對象永遠返回false,這個方法在大部分時間不符合預期,我們一般期望當全部屬性相同或者部分屬性相同時返回true。

解決辦法:如果沒有顯式的繼承其他類,則不要加callSuper = true,或者自己重寫eauqls()方法。

第二個坑是關於@Data

上面的第一個坑在@Data中也會遇到,處理方法與上面類似,同時在這裡會遇到一個新的問題:當我們寫的類顯示的繼承一個父類時,@Data生成的equals()方法無法比較父類的屬性,也就是相當沒有調用父類的equals()方法。

解決辦法:使用@EqualsAndHashCode(callSuper = true)或則會自己重寫eauqls()方法。

第三個坑是關於@Builder

在我們寫的類顯示的繼承某個類的時候,在類上加@Builder無法通過鏈式調設置父類的屬性。例如下圖我們定義一個Man這個類,繼承自上文中的Person類,當在Man這個類中嘗試使用鏈式調用設置父類Person類中的name和age屬性時會報錯,Man類定義如下圖所示

IDEA上提升生產力的插件--lombok

Man類

解決方法:不使用lombok中的@Builder,自己用其他的方式實現建造者模式。或者其它同學有好的辦法可以告訴我。

其實lombok適合繼承關係單一的類,最好不要有繼承關係。

當然還有一些其他的坑,這裡就不一一列舉,我一時半會兒也沒想起來。

lombok到底該不該用?

這其實是有爭論的,我個人認為是可以適度的使用。

但是lombok存在一些弊端,需要根據實際情況去權衡一下。

  1. 如果團隊中一個人用lombok,其它人都要使用。這個問題其實可以解決,IDEA中有delombok的功能,可以將註解轉化為代碼。但是將註解轉化為代碼似乎又違背了我們使用lombok簡化代碼的初衷。
  2. 代碼可讀性和調試性降低,這個同樣採用1中的方法解決。
  3. 影響升級。如果我們需要升到一個新的JDK,而恰巧lombok不支持這個版本的JDK,這時候就比較尷尬了。
  4. lombok中存在一些坑,新手如果不熟悉很容易掉坑裡半天爬不出來。

總之,lombok確實是一款提升生產力的利器,但是同時也存在一些弊端,團隊可以根據自己實際情況權衡如何使用。


分享到:


相關文章: