Java 如何使用lombok@Builder和@Data初始化ArrayList

Java 如何使用lombok@Builder和@Data初始化ArrayList,java,arraylist,lombok,Java,Arraylist,Lombok,使用lombok进行项目,我有一个ArrayList。它为null,因为它从未初始化。在我决定使用lombok删除大部分样板代码之前,我最初在构造函数中初始化了它 让它工作的最简单的例子是什么 示例:在创建构建器后调用refresh会抛出一个空指针(注意:我省略了构建器中使用的变量,但是在构建器中没有提到参数,因此可能需要对其进行处理) @Builder 公共@数据类RMF_目标{ 私有ArrayList参数; 公共无效刷新(){ parameters.clear();//暂时清除 } } 根据

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

让它工作的最简单的例子是什么

示例:在创建构建器后调用refresh会抛出一个空指针(注意:我省略了构建器中使用的变量,但是在构建器中没有提到
参数
,因此可能需要对其进行处理)

@Builder
公共@数据类RMF_目标{
私有ArrayList参数;
公共无效刷新(){
parameters.clear();//暂时清除
}
}
根据,在类中使用默认值将不起作用

您可以提供包含以下默认值的最小生成器实现:

public static class RMF_ObjectiveBuilder{
    private ArrayList<String> parameters = new ArrayList<>();
}
公共静态类RMF\u ObjectiveBuilder{
私有ArrayList参数=新建ArrayList();
}

使用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();
        }
    }
@Builder
公共@数据类RMF_目标{
私有ArrayList参数;
公共无效刷新(){
parameters.clear();//暂时清除
System.out.println(“清除!”);
}
公共静态void main(字符串[]args){
ArrayList list=新的ArrayList(Arrays.asList(“一”、“二”));
RMF_Objective BuilObject=新RMF_ObjectiveBuilder()
.参数(列表)
.build();
builObject.refresh();
}
}
否则,您还可以使用Lombok的@Singular注释,使其生成一个“Singular”版本的parameters()方法,该方法只使用一个字符串作为输入参数。像这样:

@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();
    }
}
@Builder
public@Data class RMF_objectivesinglar{
@奇异的
私有列表参数;
公共无效刷新(){
parameters.clear();//暂时清除
System.out.println(“清除!”);
}
公共静态void main(字符串[]args){
ArrayList list=新的ArrayList(Arrays.asList(“一”、“二”));
RMF_ObjectiveSingular builtObject=新的RMF_ObjectiveSingularBuilder()
.参数(“一”)
.参数(“二”)
.build();
builObject.refresh();
}
}

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

如果使用
@Builder.Default
进行注释,则初始化
参数

@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
  }

}

这将抛出
NullPointerException

我想你的意思是,只有Getter而没有setter更安全。我不知道@Singular,修复了我部署pojo时遇到的一个问题。
@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
  }

}
new RMF_Objective(null).refresh()