Lombok 註解簡介
阿新 • • 發佈:2019-01-06
Lombok
- @AllArgsConstructor
/** * 生成一個包含所有屬性的建構函式 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface AllArgsConstructor { /** * 如果設定了該屬性,則生成的建構函式將被設定為 private,並增加一個靜態的方法來建立例項, * 靜態方法將包含建構函式的所有屬性,靜態方法的名稱為 staticName 的屬性值。 */ String staticName() default ""; AnyAnnotation[] onConstructor() default {}; /** * 生成建構函式的訪問級別,預設是 PUBLIC */ AccessLevel access() default lombok.AccessLevel.PUBLIC; @Deprecated @Retention(RetentionPolicy.SOURCE) @Target({}) @interface AnyAnnotation {} }
- @RequiredArgsConstructor
/** * 生成一個包含所有 final 屬性或有約束的屬性【@NonNull】的建構函式 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface RequiredArgsConstructor { /** * 如果設定了該屬性,則生成的建構函式將被設定為 private,並增加一個靜態的方法來建立例項, * 靜態方法將包含建構函式的所有屬性,靜態方法的名稱為 staticName 的屬性值。 */ String staticName() default ""; AnyAnnotation[] onConstructor() default {}; /** * 生成建構函式的訪問級別,預設是 PUBLIC */ AccessLevel access() default lombok.AccessLevel.PUBLIC; @Deprecated @Retention(RetentionPolicy.SOURCE) @Target({}) @interface AnyAnnotation {} }
- @NoArgsConstructor
/** * 嘗試生成一個無引數的建構函式 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface NoArgsConstructor { /** * 如果設定了該屬性,則生成的建構函式將被設定為 private,並增加一個靜態的方法來建立例項, * 靜態方法將包含建構函式的所有屬性,靜態方法的名稱為 staticName 的屬性值。 */ String staticName() default ""; AnyAnnotation[] onConstructor() default {}; /** * 生成建構函式的訪問級別,預設是 PUBLIC */ AccessLevel access() default lombok.AccessLevel.PUBLIC; /** * 如果存在 final 屬性,則無法生成無引數的建構函式【編譯失敗】,如果將 force 設定為 true, * 則所有的 final 屬性將被初始化為預設值【0 / null / false】. */ boolean force() default false; @Deprecated @Retention(RetentionPolicy.SOURCE) @Target({}) @interface AnyAnnotation {} }
- @Getter
/**
* 如果該註解放置在目標屬性上,則會為該屬性生成一個標準的 get 方法,
* 如果該註解放置在類上,則會為類中的每一個非靜態屬性生成一個標準的 get 方法。
*/
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
/**
* 生成 get 方法的訪問級別,預設是 PUBLIC
*/
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
- @Setter
/**
* 如果該註解放置在目標屬性上,則會為該屬性生成一個標準的 set 方法,
* 如果該註解放置在類上,則會為類中的每一個非靜態屬性生成一個標準的 set 方法。
*/
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
/**
* 生成 set 方法的訪問級別,預設是 PUBLIC
*/
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
AnyAnnotation[] onParam() default {};
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
- @EqualsAndHashCode
/**
* 為所有的相關屬性生成 hashCode 和 equals 方法
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface EqualsAndHashCode {
/**
* 生成 hashCode 和 equals 方法時,需要排除的屬性列表
*/
String[] exclude() default {};
/**
* 顯式列出需要包含的屬性列表,通常非靜態 static 和非瞬態 transient 的屬性都作為比較目標
*/
String[] of() default {};
/**
* 計算 hashCode 值之前,首先呼叫父類的 hashCode 方法
*/
boolean callSuper() default false;
/**
* 預設情況下,將呼叫 get 方法來讀取屬性值
*/
boolean doNotUseGetters() default false;
AnyAnnotation[] onParam() default {};
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
/**
* 只包含使用 @EqualsAndHashCode.Include 註解標記的所有屬性
*/
boolean onlyExplicitlyIncluded() default false;
/**
* 不包含此單個屬性值
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {}
/**
* 包含此單個屬性值
*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Include {
/** Defaults to the method name of the annotated member. If on a method and the name equals the name of a default-included field, this member takes its place. */
String replaces() default "";
}
}
- @ToString
/**
* 為所有的相關屬性生成 toString() 方法
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface ToString {
/**
* toString() 方法返回的字串中是否包含屬性名稱
*/
boolean includeFieldNames() default true;
/**
* 生成 toString() 方法時,需要排除的屬性列表
*/
String[] exclude() default {};
/**
* 生成 toString() 方法時,需要包含的屬性列表
*/
String[] of() default {};
/**
* 生成 toString() 方法時,是否優先呼叫父類的 toString()
*/
boolean callSuper() default false;
/**
* 預設情況下,將呼叫 get 方法來讀取屬性值
*/
boolean doNotUseGetters() default false;
/**
* 只包含使用 @ToString.Include 註解標記的所有屬性
*/
boolean onlyExplicitlyIncluded() default false;
/**
* 顯式排除此屬性
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {}
/**
* 顯式包含此屬性
*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Include {
/** 更高的 rank 優先列印,相同 rank 的屬性按照原始碼中的宣告順序列印 */
int rank() default 0;
/** 輸出的屬性名稱 */
String name() default "";
}
}
- @NonNull
/**
* 如果該註解放置在引數上,則在建構函式或方法體執行前將會增加目標引數的 null 校驗。
* 如果該註解放置在屬性上,則對該屬性的寫操作都將新增 null 校驗。
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface NonNull {
}
- @Data
/**
* 等價於 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
/**
* 如果設定了該屬性,則生成的建構函式將被設定為 private,並增加一個靜態的方法來建立例項,
* 靜態方法將包含建構函式的所有屬性,靜態方法的名稱為 staticName 的屬性值。
*/
String staticConstructor() default "";
}
- @Value
/**
* 等價於 @Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
* @AllArgsConstructor @ToString @EqualsAndHashCode
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Value {
/**
* 如果設定了該屬性,則生成的建構函式將被設定為 private,並增加一個靜態的方法來建立例項,
* 靜態方法將包含建構函式的所有屬性,靜態方法的名稱為 staticName 的屬性值。
*/
String staticConstructor() default "";
}
- @Builder
/**
* fluent build API
*/
@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {
/**
* 設定屬性的預設值
*/
@Target(FIELD)
@Retention(SOURCE)
public @interface Default {}
/** 建立 builder 例項的方法名稱 */
String builderMethodName() default "builder";
/** 構建目標例項的方法名稱 */
String buildMethodName() default "build";
/**
* builder 類的名稱
*/
String builderClassName() default "";
/**
* 將此類的例項轉換為 builder
*/
boolean toBuilder() default false;
/**
* 只有 toBuilder 為 true 時才有效。
* 用於從目標例項中讀取值,可以放置在屬性、構造方法引數、靜態方法上
*/
@Target({FIELD, PARAMETER})
@Retention(SOURCE)
public @interface ObtainVia {
/**
* @return Tells lombok to obtain a value with the expression {@code this.value}.
*/
String field() default "";
/**
* @return Tells lombok to obtain a value with the expression {@code this.method()}.
*/
String method() default "";
/**
* @return Tells lombok to obtain a value with the expression {@code SelfType.method(this)}; requires {@code method} to be set.
*/
boolean isStatic() default false;
}
}
- @Singular
/**
* 與 Builder 註解共同使用,用於將單個元素新增到集合屬性中【放置在集合屬性上】
*/
@Target({FIELD, PARAMETER})
@Retention(SOURCE)
public @interface Singular {
/** 新增單個元素的方法名稱 */
String value() default "";
}
public class Lombok {
@Test
public void all() {
final User user = User.builder().addName("hello").addName("world").build();
assertEquals(2, user.names.size());
}
}
@Builder
class User{
@Singular("addName")
public List<String> names;
}
- @Cleanup
/**
* 通過 try-final 方式自動釋放資源
*/
@Target(ElementType.LOCAL_VARIABLE)
@Retention(RetentionPolicy.SOURCE)
public @interface Cleanup {
/** 釋放資源的無參方法名稱 */
String value() default "close";
}
- @SneakyThrows
/**
* 將方法顯示丟擲的指定異常封裝為 RuntimeException
*/
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.SOURCE)
public @interface SneakyThrows {
/** 需要轉換的異常型別列表 */
Class<? extends Throwable>[] value() default java.lang.Throwable.class;
}
public class Lombok {
@Test
public void all() {
final String hello = "hello";
final String of = of(hello.getBytes(), "UTF-8");
assertEquals(of, hello);
}
@SneakyThrows
private static String of(byte[] bytes,String charsetName) {
return new java.lang.String(bytes, charsetName);
}
}
- @Synchronized
/**
* 使用 synchronized 關鍵字修飾目標方法
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Synchronized {
/**
* 需要鎖定的目標欄位名稱,不指定時預設使用 this【例項方法】或此類的 Class 例項【靜態方法】
*/
String value() default "";
}
- @val
/**
* 使用在區域性變數定義處,變數的型別根據賦值表示式進行推斷,該變數被 final 修飾。
*/
public @interface val {
}
public class Lombok {
@Test
public void all() {
val name = "hello";
assertEquals(name.getClass(), String.class);
val list = Lists.newArrayList();
assertEquals(list.getClass(), ArrayList.class);
}
}
- @FieldDefaults
/**
* 往此類中的每個欄位新增修飾符
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface FieldDefaults {
AccessLevel level() default AccessLevel.NONE;
boolean makeFinal() default false;
}
- @UtilityClass
/**
* 用於建立工具類的註解:
* 1)類將被標記為 final
* 2)類中不能有顯式宣告的建構函式否則編譯出錯,同時新增一個私有無參建構函式,此建構函式將丟擲 UnsupportedOperationException 異常
* 3)所有的屬性、方法、內部類都被 static 修飾
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface UtilityClass {
}