roh*_*hit 8 java builder lombok
如果我将@Builder 添加到一个类中。构建器方法已创建。
Person.builder().name("john").surname("Smith").build();
Run Code Online (Sandbox Code Playgroud)
我有一个要求,其中特定字段是强制性的。在这种情况下,名称字段是必需的。理想情况下,我想这样声明。
Person.builder("john").surname("Smith").build();
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索时,我发现了许多替代方案,例如覆盖构建器实现,如下所示:
@Builder
public class Person {
private String name;
private String surname;
public static PersonBuilder builder(String name) {
return new PersonBuilder().name(name);
}
}
Run Code Online (Sandbox Code Playgroud)
然后像下面这样使用它:
Person p = Person.builder("Name").surname("Surname").build();
Run Code Online (Sandbox Code Playgroud)
上述方法的问题在于它仍然提供如下所示的 name() 和 PersonBuilder() 方法,这是我不想要的:
Person p = Person.builder("Name").surname("Surname").name("").build();
Run Code Online (Sandbox Code Playgroud)
Person p = new Person.PersonBuilder().build;
Run Code Online (Sandbox Code Playgroud)
另一种方法是在 name 处添加 @lombok.nonnull 检查,这将强制在创建对象时为 name 提供值。但它是一个运行时检查。它不会强迫我在创建对象时为 name 提供值。
lombok 是否提供了任何其他技术来实现以下目标:
Person p = Person.builder("Name").surname("Surname").build();
Run Code Online (Sandbox Code Playgroud)
注意: builder() 和 name() 不应暴露。创建 Person 对象的唯一方法应该在上方或下方:
Person p = Person.builder("Name").build();
Run Code Online (Sandbox Code Playgroud)
你不能真正用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用与您已有的方法相同的方法:
public static PersonBuilder builder(String name) {
return new PersonBuilder(name);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |