Java Builder模式中如何根据条件动态包含/排除属性?
根据列表是否为空动态构建QuoteDetails对象
可行性结论
完全可行,Builder模式本身就支持条件式配置属性,只需在构建过程中对penalties列表做非空判断,选择性调用对应的Setter方法即可。
具体实现代码
public static QuoteDetails quoteDetailsForMA(String response) { handleErrors(response); try { FullResponse quoteDetails = extractResponse(response); Summary summary = summaryMA(quoteDetails); List<PenaltyElement> penalties = retrievePenalties(quoteDetails); // 先初始化Builder并设置必选属性 QuoteDetails.Builder builder = QuoteDetails.builder() .priceSummary(summary); // 仅当penalties非空时,配置该属性 if (!penalties.isEmpty()) { builder.penalties(penalties); } return builder.build(); } catch (Exception e) { LOGGER.error("Exception thrown response: {}", e.getMessage()); // 注意:原方法此处缺少返回值,编译会报错,需补充返回逻辑(示例返回null,也可抛出RuntimeException) return null; } }
补充说明
- 分步构建Builder是最直观的实现方式,逻辑清晰易维护;
- 原代码的
catch块没有返回值,属于编译错误,必须补充返回逻辑或抛出未检查异常; - 若你的Builder类支持链式调用的条件扩展(比如结合
Optional),也可以用更简洁的写法,但分步判断的兼容性和可读性最优。
内容的提问来源于stack exchange,提问作者runnerpaul
相关产品推荐
相关产品推荐

