web-dev-qa-db-ja.com

抽象クラスにLombok @Builderを実装する方法

抽象クラスを拡張するクラスがあり、@Builderをすべての子クラスの上に置きたくありません。

抽象クラスにLombok @Builderを実装する方法はありますか?

7
sam

まったく不可能です。ビルダーはコンパイル時にスーパークラスに生成され、最終的にそれを実装する可能性のあるサブクラスの知識を持つことができません。

たとえば、サブクラスには、インスタンスが有効な状態になるために使用する必要のあるコンストラクターがあり、Lombokはビルダーが生成されたときにそれに関する知識を持てません。

@Builderのドキュメントのサンプルコードをご覧ください。未知のサブクラスのインスタンス化にそれを適応させることは単に不可能であることがすぐにわかります。

2
Torben

これは、新しい(実験的)アノテーション@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();
6
Jan Rieke