如果我将@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;
另一种方法是在name处添加@lombok.nonnull检查,这将强制在创建对象时为name提供值。但这是一个运行时检查。它不会强迫我在创建对象时为name提供值。
lombok是否提供了其他技术来实现以下目标:
Person p = Person.builder("Name").surname("Surname").build();
注意:builder((和name((不应该公开。创建Person对象的唯一方法应该在上面或下面:
Person p = Person.builder("Name").build();
使用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);
}
尝试使生成器私有化。
你检查过这个评论了吗?用Lombok@Builder 需要参数
我敢肯定你会发现,一旦阅读线程一次又一次。
附言:如果你有一个只有两个字段的类,最好直接使用构造函数。
最佳实践:
import lombok.Builder;
import lombok.NonNull;
@Builder(builderMethodName = "privateBuilder")
public class Person {
@NonNull
private String name;
private String surname;
public static class PersonNameBuilder {
public PersonBuilder name(String name) {
return Person.privateBuilder().name(name);
}
}
private static class PersonExtraBuilder extends PersonBuilder{
@Deprecated
@Override
public PersonBuilder name(String name) {
return this;
}
}
public static PersonNameBuilder builder(String name) {
return new PersonNameBuilder();
}
private static PersonExtraBuilder privateBuilder(){
return new PersonExtraBuilder();
}
}
用法:
PersonNameBuilder nameBuilder = Person.builder();
PersonBuilder builder = nameBuilder.name("John");
Person p1 = builder.surname("Smith").build();
// Or
Person p2 = Person.builder().name("John").surname("Smith").build();
// The last `.name("")` will not work, and it will be marked as Deprecated by IDE.
Person p3 = Person.builder().name("John").surname("Smith").name("").build();