1. 程式人生 > >Java編碼輔助工具:Lombok —— 避免重複臃腫的程式碼,提高效率

Java編碼輔助工具:Lombok —— 避免重複臃腫的程式碼,提高效率

在專案開發過程中,經常會涉及到一些調整很少但又必不可少的環節,比如實體類的Getter/Setter方法,ToString方法等。這時可以使用Lombok來避免這種重複的操作,減少非核心程式碼的臃腫,提高編碼效率。

 

如何在IntelliJ IDEA中引入Lombok

  1. 安裝Lombok 外掛(否則在呼叫setter/getter方法時IDE會提示報錯): File -> Settings -> Plugins   搜尋Lombok Plugin完成安裝。
  2. pom.xml中引入lombok依賴(其中<scope>provided</scope>表示只在編譯、測試階段依賴該jar,執行階段不依賴(如執行容器中已包含了該jar,則置為provided避免jar衝突),預設<scope>compile</scope>則表示在編譯、測試、執行階段都依賴
    ):
 <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
</dependency>

  

Lombok註解用途 (參考:https://blog.csdn.net/vbirdbest/article/details/79495398)

@Getter/@Setter

為欄位生成Getter和Setter方法,可以註解到欄位或者類上(註解在類上會為類中所有欄位生成Getter和Setter方法)。預設是public型別的,如果需要的話可以修改方法的訪問級別: @Getter(AccessLevel.PROTECTED) 

Lombok中的註解一般都會包含一個無參建構函式註解@NoArgsConstructor(用於生成無參建構函式) ,所以還會額外生成一個無參建構函式

@NonNull

呼叫欄位的setter方法時,如果傳的引數為null,則會丟擲空異常NullPointerException,生成setter方法時會檢查引數是否為空

@NoArgsConstructor

生成一個無參構造方法。當類中有final欄位沒有被初始化時,編譯器會報錯,此時可用@NoArgsConstructor(force = true),然後就會為沒有初始化的final欄位設定預設值 0 / false / null, 這樣編譯器就不會報錯。對於具有約束的欄位(例如@NonNull欄位),不會生成檢查或分配,因此請注意,正確初始化這些欄位之前,這些約束無效。

@RequiredArgsConstructor

生成構造方法(可能帶引數也可能不帶引數),如果帶引數,這引數只能是以final修飾的未經初始化的欄位,或者是以@NonNull註解的未經初始化的欄位。

@RequiredArgsConstructor(staticName = “of”)會生成一個of()的靜態方法,並把構造方法設定為私有的

@AllArgsConstructor

生成一個全引數的構造方法

@ToString

生成toString()方法,預設情況下它會按順序(以逗號分隔)列印你的類名稱以及每個欄位。可以這樣設定不包含哪些欄位,可以指定一個也可以指定多個@ToString(exclude = “id”) / @ToString(exclude = {“id”,”name”}) 。如果繼承的有父類的話,可以設定callSuper 讓其呼叫父類的toString()方法,例如:@ToString(callSuper = true)

@EqualsAndHashCode

生成hashCode()和equals()方法,預設情況下,它將使用所有非靜態,非transient欄位。但可以通過在可選的exclude引數中來排除更多欄位。或者,通過在of引數中命名它們來準確指定希望使用哪些欄位。

// exclude 排除欄位
@EqualsAndHashCode(exclude = {“password”, “salt”})

// of 指定要包含的欄位
@EqualsAndHashCode(of = {“id”, “phone”, “password”})

@Data

@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能

@Value

@Value 將欄位都變成不可變型別:使用final修飾, 同時還包含@ToString、@EqualsAndHashCode、@AllArgsConstructor 、@Getter(注意只有Getter沒有Setter)

@Log

生成log物件,用於記錄日誌,可以通過topic屬性來設定getLogger(String name)方法的引數 例如 @Log4j(topic = “com.xxx.service.xxx”),預設是類的全限定名,即 類名.class,log支援以下幾種:

@Log              java.util.logging.Logger
@Log4j           org.apache.log4j.Logger
@Log4j2         org.apache.logging.log4j.Logger
@Slf4j             org.slf4j.Logger
@XSlf4j          org.slf4j.ext.XLogger
@CommonsLog     org.apache.commons.logging.Log
@JBossLog            org.jboss.logging.Logger

@Log
    private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
    private static final Logger log = org.apache.log4j.Logger.Logger.getLogger(UserService.class);
@Log4j2
    private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
    private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CommonsLog
    private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@JBossLog
    private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);

@SneakyThrows

使用try catch 修飾方法,來捕獲異常, 預設捕獲的是Throwable異常,也可以設定要捕獲的異常:@SneakyThrows(InterruptedException.class)

@Synchronized

給方法加上同步鎖

@Cleanup

主要用來修飾 IO 流相關類, 會在 finally 程式碼塊中對該資源進行 close();

@Getter(lazy = true)

標註欄位為懶載入欄位,懶載入欄位在建立物件時不會進行初始化,而是在第一次訪問的時候才會初始化,後面再次訪問也不會重複初始化

@Wither

提供了給final欄位賦值的一種方法

@Builder

為你的類生成複雜的構建器API。

 @Delegate

為List型別的欄位生成一大堆常用的方法,其實這些方法都是List中的方法 。注意:一個類中只能使用一個@Delegate註解,因為使用多個會生成多個size()方法,從而會編譯報錯。