java - 带有强制参数的龙目岛构建器
问题描述
如果我将@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();
解决方案
你不能用 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);
}
推荐阅读
- c - 使用递归打印星形图案显示多行
- bash - Bash 数学表达式
- javascript - Boolean([]) 返回 true 为什么?
- python - 使用“with open”时文件位于何处?
- jenkins - Jenkins SSH 服务器在尝试通过 SSH 插件进行设置时显示错误算法协商失败
- python-3.x - 如何创建当前日期和时间的文件夹并在python中最近创建的文件夹中复制一些其他文件夹
- algorithm - 不限制访问次数的旅行商问题
- python - BeautifulSoup 试图从包装的 div 中获取文本,但返回的是空的或“无”
- javascript - Javascript代码将最后一个图像移动到多个图像之间的第一个图像
- java - 图遍历到达目的顶点