首页 > 解决方案 > 带有强制参数的龙目岛构建器

问题描述

如果我将@Builder 添加到一个类中。生成器方法已创建。

Person.builder().name("john").surname("Smith").build();

我有一个特定字段是强制性的要求。在这种情况下,名称字段是必需的。理想情况下,我想这样声明。

Person.builder("john").surname("Smith").build();

谷歌搜索时,我发现了许多替代方法,例如覆盖构建器实现,如下所示:

@Builder
public class Person {

    private String name;
    private String surname;

    public static PersonBuilder builder(String name) {
        return new PersonBuilder().name(name);
    }
}

然后像下面这样使用它:

Person p = Person.builder("Name").surname("Surname").build();

上述方法的问题在于它仍然提供了 name() 和 PersonBuilder() 方法,如下所示,这是我不想要的:

Person p = Person.builder("Name").surname("Surname").name("").build();
Person p = new Person.PersonBuilder().build;

另一种方法是在名称处添加@lombok.nonnull 检查,这将在创建对象时强制为名称提供值。但它是运行时检查。它不会强迫我在创建对象时为名称提供值。

lombok 是否提供任何其他技术来实现以下目标:

 Person p = Person.builder("Name").surname("Surname").build();

注意:builder() 和 name() 不应暴露。创建 Person 对象的唯一方法应该是在上面或下面:

 Person p = Person.builder("Name").build();

标签: javabuilderlombok

解决方案


你不能用 lombok 真的做到这一点,请参阅图书馆作者的解释。但是,自己推出这个构建器有那么复杂吗?

public static class PersonBuilder {

    private final String name;
    private String surname;

    PersonBuilder(String name) {
        this.name = name;
    }

    public PersonBuilder surname(String surname) {
        this.surname = surname;
        return this;
    }

    public Person build() {
        return new Person(name, surname);
    }
        
}

使用您已有的相同方法:

    public static PersonBuilder builder(String name) {
        return new PersonBuilder(name);
    }

推荐阅读