理解@Nonnull和@CheckForNull anotations

时间:2015-06-28 12:19:16

标签: java spring null non-nullable

在我的Spring项目中有一项服务

  public Pageable<MyObject>findAccount(String accountExternalId){
  if (accountExternalId== null) {
            throw new ProjectException("Missing account");
     }
  ...
}

因此,当我使用java 5参数时,我必须制作5个ifs来检查空输入对象。不要这样做我想使用javax.annotation.Nonnulljavax.annotation.CheckForNull来做类似的事情。

public Pageable<MyObject>findAccount(@Nonnull String accountExternalId){
         ...
  }

并使用findbugs

  <groupId>
        com.google.code.findbugs
  </groupId>
  <artifactId>
        findbugs
  </artifactId>

所以我想知道这个注释是如何阻止用户不传递 Null 值的?或者它只是注释您不必传递null并且仅用于信息目的?

2 个答案:

答案 0 :(得分:2)

  

所以我想知道这个注释是如何阻止用户不传递Null值的?或者它只是注释您不必传递null并且仅用于信息目的?

第二个。

然而,FindBugs也使用其中一些注释进行分析;例如,如果你有@Nullable参数(或方法返回值),并且FindBugs在代码中检测到在使用它之前你没有检查参数(或方法返回值)是否为空,它将会提出一个问题。

如果@Nonnull那么它基本上说调用者有责任确保将非null参数传递给方法,否则方法不会返回null。

(不确定@CheckForNull@Nullable之间的差异)

答案 1 :(得分:0)

您有两种选择:

  • 允许客户端代码传递空值,但如果这样做则抛出运行时错误。
  • 通过永远不会运行可能会执行此操作的代码来阻止客户端代码传递空值。

示例代码使用运行时检查方法。您还可以generate run-time checks from @Nonnull annotations

编译时检查方法(也称为“静态分析”)更可取,并且是FindBugs方法。库作者使用@Nonnull注释编写库的合同;在构建任何库代码时运行静态分析;如果静态分析表明客户端代码可能违反了库的合同,则不应运行客户端代码。

如果在构建客户端代码时始终运行静态分析,则不需要在库中进行运行时检查。即使您选择在库中包含运行时检查,静态分析仍然很有用,因为它在测试或部署之前在编译时发现错误。

如果您需要担保,可能不想使用FindBugs。 FindBugs是一个尽力而为的工具,可以找到一些错误,但它不会尝试查找所有错误。此外,当应用于形式参数(!)时,FindBugs将@NonNull视为与@Nullable相同的含义。

您可能需要考虑静态检查的替代工具。一个例子是Checker Framework。与FindBugs不同,它提供了正确性保证,它使用的是更精确的分析。缺点是您必须使用@Nullable注释来注释您的代码,但您似乎已经愿意这样做。