在方法级使用Lombok @Builder注解时如何为参数设置默认值?
现有代码前置修正
你当前的工具类代码存在两处问题需要先修复:
setPasswort拼写错误,正确方法名为setPassword- 遗漏了
passwordRepeat字段的赋值逻辑
实现方案
有两种常用的实现方式,优先推荐第一种,兼容性最高、改造成本最低:
方案1:构建方法内做null判断回退默认值
Lombok方法级Builder会给所有未显式调用withXxx设置的参数传入null,你只要在构建方法内部对入参做非空校验,为空就替换为你定义的默认常量即可。
修改后的工具类代码如下:
public class SomeTestUtils { public static final String DEFAULT_EMAIL = "foo@bar.com"; public static final String DEFAULT_EMAIL_REPEAT = "foo@bar.com"; public static final String DEFAULT_PASSWORD = "my-password"; public static final String DEFAULT_PASSWORD_REPEAT = "my-password"; @Builder(builderMethodName = "aRegistrationRequest", setterPrefix = "with") public static RegistrationRequest buildRegistrationRequest(String email, String emailRepeat, String password, String passwordRepeat) { final RegistrationRequest request = new RegistrationRequest(); request.setEmail(email == null ? DEFAULT_EMAIL : email); request.setEmailRepeat(emailRepeat == null ? DEFAULT_EMAIL_REPEAT : emailRepeat); request.setPassword(password == null ? DEFAULT_PASSWORD : password); request.setPasswordRepeat(passwordRepeat == null ? DEFAULT_PASSWORD_REPEAT : passwordRepeat); return request; } }
方案2:自定义Builder初始化默认值
如果你不想在构建方法里写判空逻辑,可以自定义Builder类的初始化方法,给所有字段设置默认值:
public class SomeTestUtils { public static final String DEFAULT_EMAIL = "foo@bar.com"; public static final String DEFAULT_EMAIL_REPEAT = "foo@bar.com"; public static final String DEFAULT_PASSWORD = "my-password"; public static final String DEFAULT_PASSWORD_REPEAT = "my-password"; @Builder(builderMethodName = "aRegistrationRequest", setterPrefix = "with", builderClassName = "RegistrationRequestBuilder") public static RegistrationRequest buildRegistrationRequest(String email, String emailRepeat, String password, String passwordRepeat) { final RegistrationRequest request = new RegistrationRequest(); request.setEmail(email); request.setEmailRepeat(emailRepeat); request.setPassword(password); request.setPasswordRepeat(passwordRepeat); return request; } // 自定义Builder初始化方法,设置默认值 public static RegistrationRequestBuilder aRegistrationRequest() { return new RegistrationRequestBuilder() .email(DEFAULT_EMAIL) .emailRepeat(DEFAULT_EMAIL_REPEAT) .password(DEFAULT_PASSWORD) .passwordRepeat(DEFAULT_PASSWORD_REPEAT); } }
效果验证
修改完成后,你就可以直接调用无参数的build方法获取全默认值的对象,也可以自定义部分字段,其余字段自动使用默认值:
// 获取全默认值对象 RegistrationRequest defaultReq = SomeTestUtils.aRegistrationRequest().build(); // 仅自定义邮箱,其余字段用默认值 RegistrationRequest customReq = SomeTestUtils.aRegistrationRequest() .withEmail("custom@test.com") .build();
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

