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();
_
@Dataアノテーションは、以下に説明する機能のコードを暗黙的に生成します。
これは、loombokのコンストラクター宣言がParentクラスのコードを生成することを意味します。
Person(String userId、Instant requestingTime)
同様に子クラス:
Child(インスタント開始日、インスタント終了日、コレクションフィールド)
プログラムが例外をスローしているので、
Parent()は親クラスで定義されていません。
クラスに次の注釈を付けてください:
@NoArgsConstructor
これにより、必要なデフォルトのコンストラクタが生成されます。