龙目岛@Builder必需参数

2022-08-31 11:26:03

如果我向类中添加@Builder。将创建生成器方法。

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

我有一个要求,其中需要一个特定的字段。在本例中,name 字段是必需的,但姓氏不是。理想情况下,我想这样声明它。

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

我无法弄清楚如何做到这一点。我尝试过将@Builder添加到构造函数中,但它不起作用。

@Builder
public Person(String name) {
    this.name = name;
}

答案 1

您可以使用龙目岛注释配置轻松完成此操作

import lombok.Builder;
import lombok.ToString;

@Builder(builderMethodName = "hiddenBuilder")
@ToString
public class Person {

    private String name;
    private String surname;

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

然后像这样使用它

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

当然,这里是可选的。@ToString


答案 2

我建议不要使用这种方法,因为您将很难将其一致地应用于其他对象。相反,您可以只标记带有注释的字段,龙目岛将在构造函数和 setter 中为您生成空检查,因此如果未设置这些字段,这将失败。@lombok.NonNullBuilder.build()

使用生成器模式可以非常清楚地标识要将哪些字段设置为哪些值。在示例中,name 字段已丢失,如果您正在构建具有多个必填字段的对象,则所有其他必填字段将进一步丢失。考虑下面的例子,你能通过阅读代码来判断哪个字段是哪个字段吗?

Person.builder("John", "Michael", 16, 1987) // which is name, which is surname? what is 16?
    .year(1982) // if this is year of birth, then what is 1987 above?
    .build()

推荐