简体   繁体   中英

Condition based builder in Java

I have a field that needs to be checked. If the field matches put it to builder if not, don't put it to builder.

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

}

I need to check if user belongs to "high school", then add parameter lunch to builder. If user doesn't belong to "high school" don't add parameter to builder.

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();

I have come up with this code above and lunch parameter is null although it should be there.

When I add it to builder without if statement like this:

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

It works but I need to be able to check condition. What am I missing?

You shouldn't use an Optional type as a class field, generally only return types or wrappers to nullable return types.

If I understand the question, though, you're looking for this

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

Or

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

Or simply add a method to the class, not use a nullable field

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

The problem with the if statement before the builder is that you've used some other builder, but never captured its return value to use later on

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM