【lombok】@NoArgsConstructor/@RequirArgsConstructor/@AllArgsConstructor - 生成無參構造器,指定引數構造器或包含所有引數的構造器

amoscn發表於2019-02-12

這三個註解的集合接受某些欄位的一個引數,簡單的用於分配這個引數給這個欄位。

@NoArgsConstructor生成的構造器無引數。如果這是不可能的(因為有final欄位),則會導致編譯錯誤。
除非使用@NoArgsConstructor(force=true),然後將所有的final欄位都初始化為0/false/null
對於有約束的欄位,比如@NonNull,不會生成任何檢查,所以請注意直到這些欄位都適當的被初始化後,才會滿足這些約束條件。
某些java構造器,比如hibernate和服務提供介面需要無參構造器。這個註解主要同@Data或者其他生成構造器的註解一起使用。

@RequirArgsConstructor為每個需要特殊處理的欄位生成一個欄位與引數對應的構造器。所有未初始化的final欄位都獲得一個引數,
以及標識為@NonNull的任何欄位,這些欄位在申明它們時未初始化。對於這些標記為@NonNull的欄位,明確的Null檢查也會跟著生成。
如果任意標記@NonNull欄位的引數包含null,則構造器會丟擲空指標異常。這些引數的排序同這些欄位在類裡出現的順序一致。

@AllArgsConstructor在你的類中生成一個將所有欄位作為引數的構造器。標記為@NonNull的欄位將生成對應的null檢查。

所有的這些註解都支援替換格式,生成的構造器都是私用的,然後會生成一個額外的封裝私有構造器的靜態工廠方法。
這個模式通過在註解內使用staticName開啟,比如@RequiredArgsConstructor(staticName="of")。和普通構造器不一樣,
該靜態工廠方法可以推斷泛型。也就是說你的API呼叫方可以使用MapEntry.of("foo", 5)而不是new MapEntry<String, Integer>("foo", 5)

想要將註解放置在生成的構造器上,可以通過使用onConstructor=@__({@AnnotationsHere}),但是請小心,這只是一個實驗階段功能。
更多的資訊請參考文件的onX功能。

這些註解會跳過靜態欄位。

同其他lombok註解不一樣的是,指定構造器的出現不會阻礙這些註解生成它們自己的構造器。這也意味著你可以編寫你自己專門的構造器,
並讓lombok生成樣板檔案。如果出現衝突(專門的構造器和lombok生成的簽名一致),會引發編譯錯誤。

使用Lombok

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;

@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  @NoArgsConstructor
  public static class NoArgsExample {
    @NonNull private String field;
  }
}

不使用Lombok

public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  private ConstructorExample(T description) {
    if (description == null) throw new NullPointerException("description");
    this.description = description;
  }
  
  public static <T> ConstructorExample<T> of(T description) {
    return new ConstructorExample<T>(description);
  }
  
  @java.beans.ConstructorProperties({"x", "y", "description"})
  protected ConstructorExample(int x, int y, T description) {
    if (description == null) throw new NullPointerException("description");
    this.x = x;
    this.y = y;
    this.description = description;
  }
  
  public static class NoArgsExample {
    @NonNull private String field;
    
    public NoArgsExample() {
    }
  }
}

相關文章