使用lombok作为项目,我有一个ArrayList。它是null,因为它从未初始化。在我决定使用lombok删除大量样板代码之前,我最初在构造函数中初始化了这个。
什么是让它发挥作用的最简单的例子?
示例:调用refresh会在创建构建器后抛出空指针(注意:我省略了构建器中使用的变量,但构建器中未提及parameters
,所以我可能需要这样做用它来做事。)
@Builder
public @Data class RMF_Objective {
private ArrayList<String> parameters;
public void refresh(){
parameters.clear(); // Clear for now
}
}
答案 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
}
}
<块引用>
@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
。