如何使用lombok @Builder和@Data

时间:2016-09-07 21:06:56

标签: java arraylist lombok

使用lombok作为项目,我有一个ArrayList。它是null,因为它从未初始化。在我决定使用lombok删除大量样板代码之前,我最初在构造函数中初始化了这个。

什么是让它发挥作用的最简单的例子?

示例:调用refresh会在创建构建器后抛出空指针(注意:我省略了构建器中使用的变量,但构建器中未提及parameters,所以我可能需要这样做用它来做事。)

@Builder
public @Data class RMF_Objective {

   private ArrayList<String> parameters;

   public void refresh(){     
        parameters.clear(); // Clear for now
   }
}

3 个答案:

答案 0 :(得分:2)

根据https://reinhard.codes/2016/07/13/using-lomboks-builder-annotation-with-default-values/使用您班级中的默认值无效。

您可以提供包含默认值的最小构建器实现,如:

public static class RMF_ObjectiveBuilder{
    private ArrayList<String> parameters = new ArrayList<>();
}

答案 1 :(得分:2)

使用Lombok的构建器进行最简单的初始化是这样的:

    @Builder
    public @Data class RMF_Objective {

        private ArrayList<String> parameters;

        public void refresh() {
            parameters.clear(); // Clear for now
            System.out.println("cleared !");
        }

        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>(Arrays.asList("one", "two"));
            RMF_Objective builtObject = new RMF_ObjectiveBuilder()
                    .parameters(list)
                    .build();
            builtObject.refresh();
        }
    }

否则你也可以使用Lombok的@Singular注释来生成一个“奇异”的注释。 parameters()方法的版本只取一个String作为输入参数。像这样:

@Builder
public @Data class RMF_ObjectiveSingular {

    @Singular
    private List<String> parameters;

    public void refresh() {
        parameters.clear(); // Clear for now
        System.out.println("cleared !");
    }

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>(Arrays.asList("one", "two"));
        RMF_ObjectiveSingular builtObject = new RMF_ObjectiveSingularBuilder()
                .parameter("one")
                .parameter("two")
                .build();
        builtObject.refresh();
    }
}

但如果我是你,我真的只会使用@Value&#39的Lombok注释。如果您不需要构建器,那么只有一个构造函数初始化对象和Getter但没有Setter更简单。不可变对象通常更安全。

答案 2 :(得分:0)

如果用 @Builder.Default 注释,则初始化 parameters

@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class RMF_Objective {

  @Builder.Default private ArrayList<String> parameters = new ArrayList<>();

  public void refresh(){
    parameters.clear(); // Clear for now
  }

}

来自documentation

<块引用>

@Builder.Default

如果某个字段/参数在构建会话期间从未设置过,则它始终为 0 / null / false。如果您已将 @Builder 放在类(而不是方法或构造函数)上,则可以直接在字段上指定默认值,并使用 @Builder.Default: @Builder.Default private final long created = System 注释该字段。 currentTimeMillis();

注意:

  • @Data - 包括 @RequiredArgsConstructor - 已被删除
  • @AllArgsConstructor - 包含在 @Builder 中 - 访问级别已设置为 PRIVATE(默认为 PUBLIC

这可以防止通过其单参数构造函数实例化 RMF_Objective,例如

new RMF_Objective(null).refresh()

会抛出 NullPointerException