抽象クラスを拡張するクラスがあり、@Builder
をすべての子クラスの上に置きたくありません。
抽象クラスにLombok @Builder
を実装する方法はありますか?
まったく不可能です。ビルダーはコンパイル時にスーパークラスに生成され、最終的にそれを実装する可能性のあるサブクラスの知識を持つことができません。
たとえば、サブクラスには、インスタンスが有効な状態になるために使用する必要のあるコンストラクターがあり、Lombokはビルダーが生成されたときにそれに関する知識を持てません。
@Builderのドキュメントのサンプルコードをご覧ください。未知のサブクラスのインスタンス化にそれを適応させることは単に不可能であることがすぐにわかります。
これは、新しい(実験的)アノテーション@SuperBuilder
を使用して、lombok 1.18.2以降で可能です。唯一の制限は、階層内のすべてのクラスに@SuperBuilder
アノテーションが必要であることです。 Lombokはコンパイル時にすべてのサブクラスを認識できないため、すべてのサブクラスに@SuperBuilder
を配置する方法はありません。詳細は lombokのドキュメント を参照してください。
例:
@SuperBuilder
public abstract class Superclass {
private int field1;
}
@SuperBuilder
public class Subclass extends Superclass {
private int field2;
}
Subclass instance = Subclass.builder().field1(1).field2(2).build();