Lombok
是一個能夠經過簡單的註解形式來幫助咱們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,經過使用對應的註解,能夠在編譯源碼的時候生成對應的方法。 前端
簡單來講,咱們平時開發過程當中老是要花不少時間爲Java Bean
去建立getter
和setter
方法,當類裏面的屬性不少時則建立的getter
和setter
就不少,代碼就很長。而lombok
就能夠爲咱們省去建立getter
和setter
方法的麻煩,代碼也會更加簡潔。java
Lombok官方地址: https://projectlombok.org/web
操做步驟:File
-> Settings...
-> Plugins
-> Browse repositories...
-> 輸入Lombok
搜索並安裝,安裝完成後重啓IntelliJ IDEA。ide
若是是使用Maven構建項目,則添加如下依賴:函數
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency> </dependencies>
不然直接下載jar包並引入到項目中,下載地址爲:下載Lombok工具
lombok
的使用主要是經過註解方式,官網文檔lombok註解 有很詳細的說明。ui
@@NonNull
@NonNull
爲方法或構造函數的參數生成null
檢查語句,至關於if (param == null) throw new NullPointerException("param");
;生成的null
檢查語句會插入到方法的最前端,若是是構造函數,則在this()
或super()
調用以後插入null
檢查。this
使用lombok
,咱們能夠這樣寫:spa
import lombok.NonNull; public class User extends BaseEntity { private String name; private String password; public User(@NonNull Person person) { super("Hello"); this.name = person.getName(); this.password = person.getPassword(); } }
而不使用lombok
則是這樣寫:插件
import lombok.NonNull; public class User extends BaseEntity { private String name; private String password; public User(@NonNull Person person) { super("Hello"); if (person == null) { throw new NullPointerException("person"); } this.name = person.getName(); this.password = person.getPassword(); } }
@Getter
/@Setter
使用@Getter
/@Setter
給字段註解,lombok
會自動生成默認的getter
/setter
方法,在Intellij IDEA的Structure
欄中可查看這個類的概要,就能夠看到getter
和setter
方法已被添加到User
類中:
在未指定字段修飾符狀況下,lombok
生成的getter
/setter
方法是public
的,若要修改其修飾符可設置AccessLevel
的值,如:
import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; public class User { private @Getter(AccessLevel.PRIVATE) @Setter String name; private @Getter @Setter String password; }
此時能看到User
類中的getName
方法的圖標變成了一個鎖,說明getName
方法已是private
的,將不會被公開:
@ToString
使用@ToString
會生成toString()
方法,它會按順序依次打印類名、字段;若想忽略輸出字段,則能夠用exclude
設置參數;若是有繼承父類,能夠設置callSuper
爲true
讓其調用父類toString()
方法:
@ToString(exclude = "password", callSuper = true) public class User extends BaseEntity { private @Getter @Setter String name; private @Getter @Setter String password; }
@EqualsAndHashCode
使用@EqualsAndHashCode
會生成hashCode()
和equals()
方法,默認會使用全部非靜態、非transient
字段;
若是想排除某些字段可設置exclude
參數;
若是有繼承父類,能夠設置callSuper
爲true
讓其調用父類生成的equals()
和hashCode
方法,可是當沒有繼承父類並設置callSuper
爲true
時會在編譯時報錯:
import lombok.*; @EqualsAndHashCode(exclude = "password") public class User { private @Getter @Setter String name; private @Getter @Setter String password; @EqualsAndHashCode(callSuper = true) public static class Department extends BaseEntity { private @Getter @Setter String departmentName; } }
在Intellij IDEA的Structure欄中可查看到有equals()
和hashCode()
方法:
@NoArgsConstructor
, @RequiredArgsConstructor
, @AllArgsConstructor
@NoArgsConstructor
生成一個無參數構造函數:
@RequiredArgsConstructor
生成構造函數;若是帶有參數,則該參數必須是以final
修飾並未初始化的字段或@NonNull
註解的並未初始化的字段,參數的順序和字段在類中的聲明順序一致。
以@NonNull
註解並未初始化的:
以final
修飾並未初始化的:
正確和錯誤示例:
@AllArgsConstructor
生成全參數構造函數,將類中的每一個字段生成帶有1個參數的構造函數,例若有3個字段,則構造函數的參數爲3個:
@Data
@Data
包含了@ToString
, @EqualsAndHashCode
, @Getter
, @Setter
, @RequiredArgsConstructor
的功能:
@Builder
@Builder
爲類、構造器、方法上生成複雜的構建器API;構造實例時,其屬性再也不須要單獨set
,能夠經過如下方式進行實例化:Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
val
、@Cleanup
、@SneakyThrows
、@Synchronized
、@Getter(lazy=true)
、@Log
、experimental
等就再也不作介紹,用法和說明可查看官網文檔https://projectlombok.org/features/all。
使用lombok
可以爲咱們省去手動建立getter
和setter
方法的麻煩,lombok
有助於代碼的整潔、效率的提升以及冗餘的減小,但也同時下降了源代碼文件的可讀性和完整性。
不可過分依賴lombok。