Lombok @Builder 的必需参数

新手上路,请多包涵

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

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

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

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

我不知道该怎么做。我尝试将 @Builder 添加到构造函数中,但没有成功。

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

原文由 jax 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

您可以使用 Lombok 注释配置轻松完成

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 这里是可选的。

原文由 Pawel 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

 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()

原文由 Anton Koscejev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题