Java 中基于条件的生成器

Condition based builder in Java

我有一个字段需要检查。如果字段匹配,则将其提交给构建器,如果不匹配,则不要将其提交给构建器。

@Data
@Builder
public class UserSchool {
    private final Long UserId;
    private final String school;
    private final Optional<String> lunch;

}

我需要检查用户是否属于“high school”,然后将参数 lunch 添加到构建器。如果用户不属于“高中”,请不要向构建器添加参数。

if(user.school.name().equals(School.high_school.name())){
            Deposit.builder()
                    .lunch(request.getLounchName());
        }

UserSchool userSchool = UserSchool.builder()
                .UserId(Long.valueOf(user.UserId.id))
                .school(request.getUserSchool())
                .build();

我想出了上面的这段代码,午餐参数是 null 虽然它应该在那里。

当我在没有 if 语句的情况下将它添加到构建器时:

UserSchool userSchool = UserSchool.builder()
                .UserId(Long.valueOf(user.UserId.id))
                .school(request.getUserSchool())
                .lunch(request.getLounchName())
                .build();

它有效,但我需要能够检查条件。 我错过了什么?

您不应将可选类型用作 class 字段,通常只能使用 return 类型或可空 return 类型的包装器。

不过,如果我理解这个问题,那么您正在寻找这个

UserSchool.Builder builder = UserSchool.builder()
                .UserId(Long.valueOf(user.UserId.id))
                .school(request.getUserSchool());
if (condition) {
   builder.lunch(..);
}
UserSchool userSchool = builder.build();

String lunch = condition ? "some value" : null;
UserSchool.Builder builder = UserSchool.builder()
                .UserId(Long.valueOf(user.UserId.id))
                .lunch(lunch)
                .school(request.getUserSchool())
               .build();

或者简单地向 class 添加一个方法,而不是使用可为 null 的字段

public Optional<String> getLunch() {
    return condition ? Optional.of("some value") : Optional.empty();
} 

构建器之前的 if 语句的问题是您使用了其他构建器,但从未捕获其 return 值以供稍后使用