【问题标题】:Lombok: @RequiredArgsConstructor creates constructor from final but not from @NotNullLombok:@RequiredArgsConstructor 从 final 但不是从 @NotNull 创建构造函数
【发布时间】: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


【解决方案1】:

我错误地解释了 Project Lombok 文档,该文档说“所有未初始化的最终字段都获得了一个参数,以及任何标记为 @NonNull 且未在声明它们的位置初始化的字段。”

我认为@NonNull 是指任何标记为@NotNull 或等效项的字段,来自javax.validation.constraints.NotNull/NotEmpty,而实际上它的字面意思是来自lombok.NonNull@NonNull

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多