最近發(fā)現(xiàn)了一個非常好用的庫,叫做Lombok,它可以幫助我們簡化一些Java代碼的編寫。我試用了一下感覺非常好用,所以來介紹一下。
下面對Lombok的簡單使用方法做一下總結(jié):
- val 這不是一個注解,用于局部變量聲明,減少重復(fù)輸入。
- @NotNull 作用在方法參數(shù)上的注解,用于自動生成空值參數(shù)檢查。
- @Cleanup 作用在局部變量上,在作用域結(jié)束時會自動調(diào)用close方法釋放資源。
- @Getter 作用在字段上,會自動生成字段的Getter;作用在類上,會自動生成該類所有非靜態(tài)字段的Getter,還能控制Getter的訪問級別
- @Setter 基本同上。
- @ToString 類注解,自動生成類的toString方法,可以做一些定制,比如不使用某個字段,不調(diào)用Getters等。
- @EqualsAndHashCode 類注解,自動生成類中所有非靜態(tài)非瞬時字段的equals方法和hashCode方法。
- @NoArgsConstructor 類注解,自動生成一個無參構(gòu)造函數(shù)。
- @AllArgsConstructor 類注解,生成一個初始化所有字段的構(gòu)造函數(shù)。
- @RequiredArgsConstructor 類注解,為final字段和標(biāo)記了@NotNull的字段生成構(gòu)造函數(shù)。
- @Data 類注解,相當(dāng)于同時應(yīng)用了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。如果已經(jīng)定義了一個構(gòu)造方法,就不會再自動生成構(gòu)造方法了。
- @Value 類注解,和@Data類似,但是用于不可變類型。生成的類和所有字段都設(shè)置為final,所有字段都為private,自動生成Getter但是沒有Setter,會生成初始化所有字段的構(gòu)造函數(shù)。相當(dāng)于同時應(yīng)用了final @ToString、 @EqualsAndHashCode、 @AllArgsConstructor 、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)和 @Getter。
常用的還有一個一些Log注解,Lombok已經(jīng)對常用的日志都做了工作。這里直接引用官網(wǎng)的介紹:
@CommonsLog
Creates private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@JBossLog
Creates private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log
Creates private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
Creates private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2
Creates private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
Creates private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
Creates private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
說了這么多,我們來看看一個例子:
package yitian.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String username;
private String password;
private String nickname;
private String address;
private LocalDate birthday;
}
可以看到,由于應(yīng)用了@Data注解和兩個構(gòu)造方法注解,代碼變得非常短小易讀。即使使用IDE自動生成這些代碼,一般也會生成超過100行的代碼。可見Lombok的方便之處。
最后再來說說Lombok的原理吧。雖然Lombok也用到了注解,但是它并沒有用到反射,而是通過一些奇技淫巧,在代碼編譯時期動態(tài)將注解替換為具體的代碼。所以JVM實際運(yùn)行的代碼,和我們手動編寫的包含了各種工具方法的類相同。另外我僅僅對Lombok做了一些簡單介紹,在其官網(wǎng)上還有一些其他注解,并給出了更詳細(xì)的說明和生成前后的代碼例子。有興趣的同學(xué)可以看看。