私は、親クラスと子クラスを持っていると私は使用してい@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
詳細については。