为什么要使用 Lombok-Annotation @NonNull?

新手上路,请多包涵

Lombok 提供 注释 @NonNull 执行 nullcheck 并抛出 NPE(如果未进行不同配置)。

我不明白为什么我会按照该文档 示例 中的说明使用该注释:

 private String name;
public NonNullExample(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person is marked @NonNull but is null");
    }
    this.name = person.getName();
  }

无论如何都会抛出 NPE。此处使用注释 imo 的唯一原因是您是否希望异常与 NPE 不同。

编辑:我知道异常会被显式抛出并因此“受控”,但至少错误消息的文本应该是可编辑的,不是吗?

原文由 metters 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 608
2 个回答

编写诸如 @NonNull 类的类型注释有多种用途。

  • 它是 文档:它以比 Javadoc 文本更简洁和精确的方式将方法的契约传达给客户。
  • 它启用 运行时检查——也就是说,如果有错误的客户端误用您的方法,它保证您的程序崩溃并显示有用的错误消息(而不是做更糟糕的事情)。 Lombok 为您做这件事,而不是强迫程序员编写运行时检查。 引用的示例 显示了执行此操作的两种方法:使用单个 @NonNull 注释或使用明确的程序员编写的检查。 “Vanilla Java”版本要么有拼写错误( @NonNull ),要么在 Lombok 处理后显示代码。
  • 它启用 编译时检查Checker Framework 等工具可以保证代码 不会 在运行时崩溃。 NullAwayError ProneFindBugs 等工具是启发式错误查找器,它们会警告您一些 null 的误用,但不给您保证。

原文由 mernst 发布,翻译遵循 CC BY-SA 4.0 许可协议

恕我直言,您错误地理解 了该文档页面

该文档页面 并不意味着 建议您同时使用 Lombok @NonNull 注释和显式 if (smth == null) throw … 检查(以相同的方法)。

它只是说像这样的代码(我们称之为 代码 A ):

 import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;

  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

将由 Lombok 自动(内部)翻译成类似于引用问题的代码(我们称之为 代码 B )。

但是该文档页面并未说明显式编写 代码 B 对您来说是有意义的(尽管您被允许;在这种情况下 Lombok 甚至会尝试阻止双重检查)。它只是说,使用 Lombok ,您现在可以编写 代码 A (以及 它将如何工作——它将隐式转换为 代码 B )。

请注意, 代码 B 是“vanilla Java”代码。预计不会由 Lombok 第二次处理。所以 @NonNull代码 B 中只是一个普通注释,它对行为没有影响(至少,不是 Lombok 的意思)。

这是一个单独的问题,为什么 Lombok 以这种方式工作——为什么它不从生成的代码中删除 @NonNull 。最初我什至 认为 它可能是该文档页面中的错误。但是,正如 Lombok 作者在 他的评论 中解释的那样, @NonNull 是为了文档和其他工具可能进行的处理而有意保留的。

原文由 Sasha 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题