java - 如何使用 lombok @Builder 来存储不同的值?

标签 java lombok

我有以下 JPA 实体

@Data
@Builder
public class Post {
  @Id
  @GeneratedValue
  UUID id;

  @OneToMany
  Set<PostTags> tags;

  String content;
}

@Data
public class PostTag {
  @Id
  @GeneratedValue
  UUID id;

  @OneToOne
  Post post;

  String tag;
}

使用 lombok @Builder 我希望能够执行以下操作

Post post = Post.builder()
  .tags("hello", "world")
  .content("Hello world")
  .build();

我假设我需要一个自定义生成器

public static class PostBuilder {
  private Set<String> myTags = new HashSet<>();
  public PostBuilder tags(String... tags) {
    myTags.addAll(Arrays.asList(tags));
    return this;
  }
}

来自documentation它出现在那里我可以使用的 ObtainVia 注释,但我不确定如何绕过它(文档中没有示例),特别是因为我只希望 myTags特定于构建器的东西,而不是在主类本身上公开。

最佳答案

ObtainVia 仅适用于 toBuilder,因此在这种情况下不会有太大帮助。

我建议采用以下方法。

首先,在PostTag中添加一个工厂方法,例如创建标签(字符串)。此方法仅在它创建的实例中设置 tag 并将其他所有内容保留为 null。将其静态导入到要使用 PostBuilder 的类中。

接下来,在标签上使用@Singular。然后你可以这样写:

Post post = Post.builder()
   .tag(createTag("hello"))
   .tag(createTag("world"))
   .content("Hello world")
   .build();

最后,自定义 build() 方法,使其首先创建 Post 实例(就像未自定义的 build() 方法一样)然后将这个新创建的 Post 实例设置为所有 PostTag 实例中的 post。 查看 delomboked 代码,确保在自定义构建器时使用正确的构建器类和方法 header 。

关于java - 如何使用 lombok @Builder 来存储不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716242/

相关文章:

java - Java 字符串与数组匹配时出现问题

java - 附加分析器是否会导致某些东西比其他东西运行得慢?

Gradle Maven 发布到 nexus delombok 源代码

java - Lombok 和斯波克 : @RequiredArgsConstructor doesn't hide default no-args constructor for a field with a type of interface

java - 哪一个对于初始化变量是有效的,即构造函数或激活方法?

java - JTextArea 作为单元格渲染器似乎不适用于换行样式字

Java Zip 文件提取

java - @RequiredArgsConstructor 不生成构造函数

java - Lombok 未创建默认构造函数导致 jackson-databinding 失败

java - 在 Kotlin 中生成 toString() 方法的速记语法(用于非数据类)