Java中基于条件使用Builder构造对象时参数缺失问题排查
错误原因
- 你在if分支中创建的是
Deposit类的Builder实例,和目标类UserSchool无关联,且该实例调用lunch方法后没有被保存,直接被丢弃 - 最终构造
UserSchool时使用的是全新的Builder实例,完全没有继承if分支里的赋值逻辑 - 额外注意:
UserSchool的lunch字段是Optional<String>类型,直接传入字符串会触发类型错误,需包装为Optional实例;代码中request.getLounchName大概率为拼写错误,正确应为request.getLunchName
正确实现方案
先持有Builder实例,满足条件时追加参数,最后统一构建对象:
// 初始化Builder,赋值通用参数 UserSchool.UserSchoolBuilder userSchoolBuilder = UserSchool.builder() .UserId(Long.valueOf(user.UserId.id)) .school(request.getUserSchool()); // 满足条件时追加lunch参数 if (user.school.name().equals(School.high_school.name())) { userSchoolBuilder.lunch(Optional.ofNullable(request.getLunchName())); } // 构建最终对象 UserSchool userSchool = userSchoolBuilder.build();
可选优化
如果希望未赋值时lunch字段默认返回空的Optional而非null,可以给字段添加@Builder.Default注解指定默认值:
@Data @Builder public class UserSchool { private final Long UserId; private final String school; @Builder.Default private final Optional<String> lunch = Optional.empty(); }
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

