web-dev-qa-db-ja.com

lombok @Dataは「抽象クラスにfinalフィールドがある場合、「lombokには基本クラスにデフォルトのコンストラクタが必要」」と文句を言う

@Data
public abstract class B {
   private final String str;
}

@Data
public class A extends B{
   private final String s;
}

クラスAのデータはintellijで文句を言いますが、コードはコマンドラインから正常にコンパイルできます。

3
Richard

1つの問題は、@Dataが変更可能なデータ用であり、クラスに変更可能なものがないことです。したがって、@Dataを使用することは単に間違っています...コンパイルするかどうかは実際には重要ではありません。

変更可能なデータが必要な場合は、finalフィールドを削除してください。不変データの場合、すべてのフィールドをfinalにし、@Valueを使用します。場合によっては、部分的に変更可能なデータが必要ですが、混乱を招き(一部のフィールドは設定可能で、一部は設定不可)、両方の欠点を提供するため、私はそれを避けるように努めています。


もう1つの問題は、Lombokがクラス階層にアクセスできないことです。 Bに最終フィールドがある場合、コンストラクターで初期化する必要があります。つまり、Aのコンストラクターはデフォルト以外のコンストラクターを呼び出す必要があります。これはロンボクでは不可能です。ロンボクには@Superbuilderがあり、これはロンボクのクラス階層をうまく処理する唯一の機能です。

0
maaartinus