【问题标题】:When is it appropriate to annotate something as @NotNull in Java?什么时候适合在 Java 中注释为 @NotNull ?
【发布时间】:2022-01-30 17:02:04
【问题描述】:

这是我在这里的第一个问题,我对 Java 还很陌生,所以如果这是一个愚蠢的问题,请原谅我。

我正在使用 JavaDocs 和注释从内部“记录”我的应用程序的预期行为,但我只是好奇在不应返回 null 的方法上使用 @NotNull 是否合适或良好的做法,但可能是由于未来的开发人员错误。

谢谢。

【问题讨论】:

标签: java


【解决方案1】:

这实际上取决于您使用的工具。 @NotNull 注释实际上并没有 任何事情。实际上,there are several different @NotNull annotations 由不同的库提供。除了表明程序员的意图之外,它们都没有自己做任何事情。

要让注解做任何事情,您需要将它与处理注解的工具结合起来(无论是在编译时还是在运行时)并对您的代码或数据应用一些验证。例如:

即使没有工具,我会说是的,这些注释对于表明意图很有用。如果注释变得不真实,您可以随时删除注释。

在您的情况下,对于代码库的所有贡献者来说,使用诸如 IntelliJ IDEA 之类的工具来检查编译时是否符合这些注释,这听起来是个好主意。这将帮助您避免您描述的开发人员错误类型。

【讨论】:

  • @Harish Dalmia 的回答表明 NotNull 是“明确的合同”,这意味着,在我看来,它确实强制执行边界条件。
  • @hd1 是的,我认为关于“明确合同”的措辞来自我链接到的 IDEA 文档。术语“契约”通常(在这种情况下)是指关于一段代码行为的声明,该声明不是由语法或类型系统强制执行的,但可以通过测试或额外的可选工具进行检查。
  • “合同”对我来说是指埃菲尔,它确实将合同作为设计执行——eiffel.org/doc/solutions/Design_by_Contract_and_Assertions
【解决方案2】:

据我所知,全球没有强制标准来使用这些类型的注释。在编写公共 API 时使用它们是有意义的,但这是特定于项目的。

无论如何,如果这有助于提高代码的清晰度和可读性,请随意在您的项目中这样做。

使用带有注释的 javadocs 并不是一种反模式


此外,如果您正在考虑警告您的方法的用户它不应该返回null,但有可能发生这种情况(因为您无法强制执行),您可能想查看Optional 类。

【讨论】:

    【解决方案3】:

    是的,使用@NotNull 是个好习惯。 @NotNull 注解实际上是一个明确的契约,声明如下:

    1. 方法不应返回 null。
    2. 变量(如字段、局部变量和参数)不能包含空值。

    所以为了简单起见,这是一个很好的做法。

    【讨论】:

    • @Sam 的评论表明它“实际上并没有做任何事情。”,而你的却是。请核对您的答案
    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2020-04-12
    • 2013-07-29
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多