web-dev-qa-db-ja.com

ロンボクのビルダーのための継承

プロジェクトにロンボクを使用しようとしていました。

私はクラスAを持っています:

@Data
@Builder
public class A {
    Integer a1;
}

そしてクラスB:

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}

BBuilderの戻り値の型はABuilderの戻り値の型と互換性がないため、Bのbuilder()はAのbuilder()をオーバーライドできないというエラーが表示されます。

ロンボクを使用してこれを行う方法はありますか?他のオプションがない限り、Bの完全なビルダーを記述したくありません。

PS: Issue のため、クラスBに明示的なコンストラクターを指定しました。検索してみましたが、良い解決策が見つかりませんでした。

17

ここでは、ビルダーのスーパーを呼び出す必要があります。

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }

    public static class BBuilder extends ABuilder{
            BBuilder() {
                super();
            }
    }
}
21

Lombokは、バージョン1.18.2の実験的機能を導入しました。ビルダーアノテーションで直面する継承の問題に対応し、@ SuperBuilderアノテーションで解決できます。

ロンボクバージョンを使用してください:1.18.2、子/親クラスの@SuperBuilderアノテーション

2
Amit Kaneria

Lombok 1.18.4をIntelliJと共に使用している場合は、次のコードが機能します。

@Data
@Builder
class A {
    Integer a1;
}

@Data
class B extends A {
    Integer b1;

    @Builder (builderMethodName = "BBuilder")
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}

public class Main {

    public static void main(String[] args){
    System.out.println(B.BBuilder().a1(1).b1(1).build());

    }
}

余談ですが、この回答を書いている時点では、@ SuperBuilderアノテーションはIntelliJでは機能しませんでした。複数レベルの継承がある場合は、Lombokを使用しないでください。回避すると、Javaモデルが乱雑になります。

0
realPK