ロンボク@SuperBuilderは私のクラスのオブジェクトを初期化していません

コードトーカー:

私は、親クラスと子クラスを持っていると私は使用してい@SuperBuilderた子オブジェクトを構築するために、一見それがすべてでは初期化されていません。私の親クラスは次のようになります。

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class MessageResponse {
    String responseMessage;
}

私の子供のクラスは次のようになります。

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class ListResponse extends MessageResponse {
    List<Item> itemList;
    int itemCount;
}

どこにアイテムがあるSerializableクラス。

最初ListResponseであります

itemList = null
itemCount = 0
responseMessage = null

私が構築しようとした際ListResponseビルダーを使用して、それは変更されませんListResponse全てのオブジェクトを。私はとして構築しようとしています

//listResponse is @Autowired from Spring and is initially as shown above. 
List<Item> itemList = getItems(); // It returns a list of 15 items, i have checked in debugger, It does.
listResponse.builder()
        .bucketList(itemList)
        .responseMessage("Item List.")
        .bucketCount(itemList.size())
        .build();

でも実行後.build()、この内容listResponse物はまだです(null, 0 , null)

私はに関する他の文献を検索しようとした@SuperBuilder@Builderが、何の結果を得ませんでした。誰かが間違ってここに何が起こっているかを指摘していただけますか?

ヤンリーケ:

ビルダーは、常に新しいインスタンスを作成します。これは、Builderパターンの目的であり、それはあなたがロンボクの使用しているかどうか、ビルダーはどのように動作するかである@SuperBuilder@Builderまたは手動のビルダーの実装を。

あなたはそれを見ることができるbuilder()方法がありstatic、それはインスタンスにアクセスできないように、(一般的に、あなたのIDEを書くために専門家の意見、ここではあなたに警告を与える必要があり、メソッドListResponse.builder()の代わりに)。

既存のインスタンスからフィールドを予め充填されたビルダーを使用して新しいインスタンスを作成したい場合は、使用することができますtoBuilder = true上の注釈パラメータとして@(Super)Builder次に呼び出しますlistResponse.toBuilder()

あなたは、インスタンスを変更したい場合は、Builderパターンは正しい選択ではありません。代わりにセッターを使用してください。これらは流暢、連鎖可能なスタイルにも、ロンボクによって生成することができます。参照@Accessors詳細については。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=280527&siteId=1