@Data
アノテーションを持つクラスがありますが、引数付きのコンストラクターが生成されるのか、生成された唯一のコンストラクターがVanilla Javaのデフォルト(引数なし)なのかわかりません。
@RequiredArgsConstructor
は、コンストラクターが定義されていない場合に生成されます。
@Dataは、クラスに暗黙的な@ Getter、@ Setter、@ ToString、@ EqualsAndHashCode、および@ RequiredArgsConstructor注釈を持つようなものです(明示的に記述されたコンストラクタが存在する場合、コンストラクタは生成されないことを除く)。
@Dataは@RequiredArgsConstructorのみを作成しています。 データアノテーション および コンストラクタ に関するLombokドキュメントサイトの説明:
@RequiredArgsConstructorは、特別な処理が必要なフィールドごとに1つのパラメーターを持つコンストラクターを生成します。初期化されていないすべての最終フィールドは、パラメーターと、宣言されている場所で初期化されていない@NonNullとしてマークされているフィールドを取得します。 @NonNullでマークされたフィールドについては、明示的なnullチェックも生成されます。 @NonNullでマークされたフィールド用のパラメーターにnullが含まれている場合、コンストラクターはNullPointerExceptionをスローします。パラメータの順序は、フィールドがクラスに表示される順序と一致します。
Lombok @Dataアノテーションを使用するPOJOがあるとします:
public @Data class Z {
private String x;
private String y;
}
Zクラスに「必須」の引数がないため、Z z = new Z(x、y)としてオブジェクトを作成することはできません。 @Dataはプロパティのセッターとゲッターを提供し、インスタンスの作成後にsetXとsetYを呼び出すことができるため、ゼロパラメーターでコンストラクターを作成しています。
Xとyを@NonNullまたはfinalにして、コンストラクターに渡すか、クラスZに@AllArgsConstructorで注釈を付ける必要があります。