原創(chuàng)文章,轉載請標注出處:《Java基礎系列-Lombok常用注解》
Lombok注解解析:
@NonNull
使用在方法的參數(shù)或者構造器的參數(shù)上,用于生成null驗證。
Lombok可以識別任何第三方工具的字段上標注的@NonNull名稱的注解,并在使用@Data、@AllArgsContruct進行生成方法和構造器時進行null判斷。
而Lombok的@NonNull注解使用在參數(shù)之上,僅僅作用到你自定義的方法和構造器之上。
null判斷會采用:
if (param == null)
throw new NullPointerException("param is marked @NonNull but is null");
的形式插入,并且會在你方法的開頭和構造器的this,super之類的調用之后插入。
@Cleanup
使用在資源之前,用于表示資源可以被完美自動釋放(在代碼的執(zhí)行路徑超出資源范圍之前)。
將該注解標注在表示資源的變量之上,比如:@Cleanup InputStream in = new FileInputStream("some/file");
這樣一來,在資源范圍結束的位置會自動調用in.close()方法進行資源釋放。這個調用會在try...finally...塊中調用,來保證調用必定會執(zhí)行。
當然,你也可以在注解內部定義釋放資源的方法名稱,來指定釋放資源的具體方法,這適用于沒有close()方法的情況下,必須保證這些方法是無參的。
@Getter and @Setter
標注在字段之上,用于自動生成get、set方法。Boolean類型為is開頭。
生成的get、set方法默認情況之下都是public的,但也可以手動指定范圍value=AccessLevel.PUBLIC、AccessLevel.PROTECTED、AccessLevel.PRIVATE、AccessLevel.PRIVATE四種。
也能標注在類上,表示針對該類中所有的非靜態(tài)字段進行get、set方法自動生成。
如果指定某個字段的AccessLevel=AccessLevel.NONE,則可以使該生成動作失效,此時可以手動實現(xiàn)get、set方法,這應用于在這些方法中有一些自定義邏輯的情況下。
@ToString
標注于類之上,用于生成toString()方法。
includeFieldNames,默認為true,表示在toString輸出時輸出字段名稱。
callSuper,默認為false,表示生成toString時不輸出超類中的字段內容,若要輸出超類中的內容,需要設置為true
doNotUseGetters,默認為false,表示獲取字段值時通過get方法獲取,設置為true表示直接通過字段獲取
onlyExplicitlyIncluded,默認為false,表示輸出所有非靜態(tài)字段內容,如果設置為true,則只輸出標注有@ToString.Include的字段和方法
@ToString.Include
標注于字段、方法之上,表示生成toString方法時包含該注解標注的字段和方法,需要與onlyExplicitlyIncluded一起使用。
rank,默認為0,表示級別,數(shù)字越大級別越高,高級別將會優(yōu)先輸出,同級別按照代碼順序輸出。
name,可以為標注的成員(字段或者方法)另起一個名字。
@ToString.Exclude
標注于字段之上,表示生成toString方法時不包含被該注解標注的字段。那么生成toString方法時會跳過這些字段,
@EqualsAndHashCode
標注于類之上用于生成hashCode方法和equals方法。
callSuper,同上
doNotUseGetters,同上
onlyExplicitlyIncluded,同上,需要配合@EqualsAndHashCode.Include使用。
@EqualsAndHashCode.Include
標注于字段或者方法之上,需要與onlyExplicitlyIncluded配合使用,表示將該注解標注的內容添加到實現(xiàn)hashCode和equals方法的內容中去。
@EqualsAndHashCode.Exclude
標注于字段之上,用于排除不需要參與生成hashCode和equals方法的字段。可單獨使用。
@NoArgsConstructor
用于生成無參構造器,如果類中存在final字段,則會報編譯錯誤。一般結合其他幾個構造器注解一起使用提供一個無參構造器,并且不會檢查@NonNull標注的字段
force,默認為false,表示是否針對final字段進行特殊處理,如果將其設置為true,則上面的編譯錯誤將會消失,內部處理為,將final字段初始化為0\false\null
access,默認為lombok.AccessLevel.PUBLIC,表示public范圍的構造器
staticName,一旦設置該值,則會生成一個靜態(tài)的“構造器”工廠,其內部包裹著一個私有的構造器,對外提供創(chuàng)建對象的功能,這是明顯的工廠模式。
@RequiredArgsConstructor
用于按照要求生成構造器,所謂的要求就是包含final字段和類似于@NonNull約束標注的字段,會對@NonNull字段進行明確的null檢查
access,同上
staticName,同上
@AllArgsConstructor
用于生成包含所有字段的構造器。@NonNull字段會進行null判斷檢查。
access,同上
staticName,同上
@Data
標注于類之上,是@ToString,@EqualsAndHashCode、@Getter、@Setter、@RequiredArgsConstructor的綜合體
staticConstructor,同staticName
@Value
可以看成是@Data的變體,表示生成一個不可變類(final類)。沒有set方法,只有get方法,字段全部為final private的,類也是final的
等效于@Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode
staticConstructor,同上。
如果手工實現(xiàn)了任何一個注解的功能,那么該注解將失效,為了使注解起效,你可以在手共實現(xiàn)的方法上添加注解@lombok.experimental.Tolerate,用于將手共實現(xiàn)對lombok隱藏。
我們可以使用下面兩種方式來重寫默認為final和private的行為,一是直接在字段上添加accessLevel,二是使用@NonFinal或者@PackagePrivate注解。
@Builder
標注于類之上,用于生成復雜的builder API,創(chuàng)建構建者模式。
還可用于標注于構造器和方法之上。
@SneakyThrows
標注于方法之上用于隱藏異常拋出語句,該注解存在爭議,暫不使用
@Log
- @CommonsLog
- @Flogger
- @JBossLog
- @Log
- @Log4j
- @Log4j2
- @Slf4j
- @XSlf4j
@Synchronized
標注于方法(只能用于靜態(tài)方法和實例方法)之上,用于表示同步方法,鎖可以使用默認的也可以使用自定義的鎖(private final )。