在Java項目中,經常要寫大量的get,set,toString()等方法,尤其是類的屬性比較多時,比較浪費時間,這時候就推薦一個Intellij Idea上的一個神器Lombok。
Lombok使用方法
首先在Idea上安裝插件lombok如下圖所示:
在項目中引入依賴,以Maven為例:
這樣就準備就緒了,接下來可以在項目中使用lombok了。lombok主要是用註解的方法代替原來對象中需要手動實現的get,set,toString()等方法。當然不僅限於這些。
常用註解
常用註解如下圖所示:
changchangyyog
使用例子
定義一個簡單的Person類,如下所示:
調用方法:
第3行代碼用於驗證註解@NoArgsConstructor是否生成無參構造函數;
第4行代碼用於驗證註解AllArgsConstructor是否生成包含全部參數的構造函數;
第5到8行說明@Builder註解可以自動生成建造者模式代碼,使得我們可以採用鏈式調用創建對象;
第9,10行調用了@Data生成的toString方法;
第11,12行調用了@Data生成的hashCode方法;
第13行調用了@Data生成的`euqals方法;
第14行是註解@Data附贈的一個方法,用於判斷某個對象是否屬於當前類的實例。
看下執行結果:
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類定義如下圖所示
解決方法:不使用lombok中的@Builder,自己用其他的方式實現建造者模式。或者其它同學有好的辦法可以告訴我。
其實lombok適合繼承關係單一的類,最好不要有繼承關係。
當然還有一些其他的坑,這裡就不一一列舉,我一時半會兒也沒想起來。
lombok到底該不該用?
這其實是有爭論的,我個人認為是可以適度的使用。
但是lombok存在一些弊端,需要根據實際情況去權衡一下。
- 如果團隊中一個人用lombok,其它人都要使用。這個問題其實可以解決,IDEA中有delombok的功能,可以將註解轉化為代碼。但是將註解轉化為代碼似乎又違背了我們使用lombok簡化代碼的初衷。
- 代碼可讀性和調試性降低,這個同樣採用1中的方法解決。
- 影響升級。如果我們需要升到一個新的JDK,而恰巧lombok不支持這個版本的JDK,這時候就比較尷尬了。
- lombok中存在一些坑,新手如果不熟悉很容易掉坑裡半天爬不出來。
總之,lombok確實是一款提升生產力的利器,但是同時也存在一些弊端,團隊可以根據自己實際情況權衡如何使用。
閱讀更多 攻城獅Bilbo 的文章