web-dev-qa-db-ja.com

最終フィールドを持つ抽象クラスでLombok @SuperBuilderを使用する方法

Lombokアノテーション__@Data_および_@SuperBuilder_を含む次のクラスがあるとします。

_@Data
@SuperBuilder
public abstract class Parent {

    protected final String userId;
    protected final Instant requestingTime;
}

@Data
@SuperBuilder
public class Child extends Parent {

    private final Instant beginningDate;
    private final Instant endingDate;
    private final Collection<String> fields;
}

_

Childクラスの_@Data_アノテーションに次のエラーが表示されます。

暗黙のスーパーコンストラクターParent()は未定義です。別のコンストラクターを明示的に呼び出す必要があります。

Builderを呼び出すときに初期化されるChildおよびfinalクラスのすべてのChildフィールドを初期化するために、Parentクラスの_@Data_アノテーションにデフォルト以外のコンストラクターを構成する方法はありますか?

子クラスと親クラスの両方で_@Data_、_@Getter_、_@Setter_アノテーションと_@SuperBuilder_アノテーションのいくつかの異なる組み合わせを試しましたが、機能するものは見つかりませんでしたまだ解決。私はLombok 1.18.10を使用しています。

参考までに、 this 質問は関連しています

[〜#〜]編集[〜#〜]

これは事実上、LombokがSuperBuilder.build()オペレーションを作成して呼び出すコンストラクターです。

_public Child(
    final String userId,
    final Instant requestingTime,
    final Instant beginningDate,
    final Instant endingDate,
    final Collection<String> fields) {

    super(userId, requestingTime);
    this.beginningDate = beginningDate;
    this.endingDate = endingDate;
    this.fields= fields;
}
_

要求されたとおり、これはChildオブジェクトでビルダーを呼び出すことを期待する方法です。

_final Child child = Child.Builder()
                         .userId(<value>)
                         .requestingTime(<value>)
                         .beginningDate(<value>)
                         .endingDate(<value>)
                         .fields(<value>)
                         .build();
_
2
burtmacklin16

@Dataアノテーションは、以下に説明する機能のコードを暗黙的に生成します。


  • セッター
  • ゲッター
  • toString
  • equallAndHashCode
  • コンストラクター(必要な引数のみ)

これは、loombokのコンストラクター宣言がParentクラスのコードを生成することを意味します。

Person(String userId、Instant requestingTime)

同様に子クラス:

Child(インスタント開始日、インスタント終了日、コレクションフィールド)


プログラムが例外をスローしているので、

Parent()は親クラスで定義されていません。

クラスに次の注釈を付けてください:

@NoArgsConstructor

これにより、必要なデフォルトのコンストラクタが生成されます。

0
Hunter