You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在方法级使用Lombok @Builder注解时如何为参数设置默认值?

现有代码前置修正

你当前的工具类代码存在两处问题需要先修复:

  1. setPasswort拼写错误,正确方法名为setPassword
  2. 遗漏了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:06:05