web-dev-qa-db-ja.com

ロンボクの@Builder継承の回避策

Lombok @Builderは、継承のユースケースでは機能しません。

例えば

class Foo{
 protected int xyz1;
 .....
 protected String xyz7;
}


class Bar extends Foo{

}

特定のユースケースでは、LombokはFooクラスで定義されたパラメーターの値を設定するメソッドを生成できません。

これの回避策は次のとおりです。

  1. Barの手動作成コンストラクタ。
  2. そのコンストラクターにビルダー注釈を付けます。

より良い回避策はありますか?

23
Vivek Goel

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

@SuperBuilder
public class ParentClass {
    private final String a;
    private final String b;
}

@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}

これで、次のようにBuilderクラスを使用できます(@Builderアノテーションでは不可能でした)。

ChildClass.builder().a("testA").b("testB").c("testC").build();
13
Anamika

それは少し隠されていますが、人々は以前にこの質問をしました、参照してください:

https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/

ブログ投稿を要約するには

@AllArgsConstructor
public class Parent {
  private String a;
}

public class Child extends Parent {

  private String b;

  @Builder
  private Child(String a, String b){
    super(a);
    this.b = b;
  }
}

使用できるようになります

Child.builder().a("testA").b("testB").build()

他の回答が現在(この回答が投稿された時点ではありません)、ライブラリでより適切に見える@SuperBuilder機能が利用可能であることを示しているため、これは参照用にここに残します。

9
fd8s0

現在、この問題の解決策が検討されています。ここで進行状況を確認してください: https://github.com/rzwitserloot/lombok/pull/1337

0
Jacques Koorts