【发布时间】:2020-07-26 19:33:01
【问题描述】:
我正在尝试使用@RequiredArgsConstructor 创建一个基本的Recipe 类,但Lombok 似乎没有正确创建所需的args 构造函数。虽然它会成功创建其他构造函数,例如@AllArgsConstructor,但即使我有用@NotEmpty/@NotNull 注释的值,所需的args 构造函数也是空的。我已经仔细检查了我已经导入了RequiredArgsConstructor。
这是我班级的精简版:
@RequiredArgsConstructor
public class Recipe
{
@NotEmpty
String name;
@NotNull
ArrayList<Ingredient> ingredients;
@NotNull
ArrayList<String> steps;
// Time in mins
int time;
String creator;
}
Lombok 创建的构造函数(我在构建的类文件中签入)是空的。
请注意,当我在我的类中将 @NotNull 字段设为 final 时,Lombok 将创建正确的必需 args 构造函数:
public Recipe(String name, ArrayList<Ingredient> ingredients, ArrayList<String> steps) {
this.name = name;
this.ingredients = ingredients;
this.steps = steps;
}
所以它看起来好像忽略了@NotNull 注释。对于我在这里可能做错的事情,我将不胜感激。谢谢!
【问题讨论】:
-
你没有做错什么,这就是lombok的工作方式。必需参数是在构造对象之后无法设置的参数,因此是
final字段。@NotNull没有说明 when 需要设置引用(在持久化它之前可能是一个设置器)。 -
@M.Deinum 在 Lombok 项目网站上,它说“所有未初始化的最终字段都有一个参数,以及任何标记为 NonNull 的字段在声明它们的位置未初始化. " 这不意味着我的 NotNull 标记项应该是生成的构造函数的一部分吗?
-
lombok.NonNull不是javax.validation.constraints,NotNull。这是一个完全不同的注释,甚至是一个专门的龙目岛注释。 -
lombok.NonNull是唯一真正使 Lombok 强制非空的注释。所有其他“No[tn][Nn]ulll”注释可以表示任何内容,例如,该字段可能为空,但随后验证失败。因此不需要在构造函数中立即设置字段。
标签: java constructor lombok intellij-lombok-plugin