@Nullable注解的用法

435

我看到Java中有一些方法的声明:

void foo(@Nullable Object obj)
{ ... }

这里的@Nullable是什么意思?它是否意味着输入可以是null

没有这个注解,输入仍然可以为null,所以我猜这不是全部内容?


4
从下面的回答中,我了解到注释表示空值是可接受的,以及它被使用的示例,还有我可以尝试的代码分析器,以及可能会有不同的解释。你看出这个格式很好吗?点赞给大家,特别是提出这个问题的人。 - icedwater
14
在您的问题所涉及的上下文中,提供了@Nullable注释的库是哪个?是Checker框架吗? - 8bitjunkie
请参见 https://dev59.com/62445IYBdhLWcg3wQX6G。 - tkruse
4个回答

449

这表明该方法接受null值,如果你重写了该方法,也应该接受null值。

它还作为代码分析器的提示,例如像FindBugs这样的工具。例如,如果这样的方法在未先检查null的情况下对其参数进行解引用,则FindBugs将发出警告。


95

这个注解通常用于消除 NullPointerException(空指针异常)@Nullable(可为空) 表示此参数可能为 null。一个很好的例子可以在 Google Guice 中找到。在这个轻量级依赖注入框架中,您可以告诉它这个依赖可能是 null。如果您尝试传递未经注释的 null,该框架将拒绝执行其工作。

此外,@Nullable(可为空) 可以与 @NotNull(不可为空) 注解一起使用。在这里,您可以找到一些有关如何正确使用它们的提示。 IntelliJ 中的代码检查会检查这些注解并帮助调试代码。


20

8

毫无疑问,有着不同的思维方式。在我的世界里,我不能强制执行“永远不传递null”的法则,因为我要处理无法控制的第三方,如API调用者、数据库记录、前任程序员等等... 因此,我的做法是极度谨慎和防御性的。如果你使用的是Java8或更高版本,则有比if块更简洁的方法。

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

您还可以通过将 .orElse 替换为 orElseThrow(() -> new Exception("不要发送null")) 来在其中引发一些异常。

如果您不想使用 @Nullable(没有增加任何功能),为什么不只是使用 mayBe... 命名参数,这样您的意图就清晰了。


10
使用 Optional 作为 if 语句的替代方案是一种反模式,因为它会不必要地创建一个新对象。Optional 的创建者在这里提到了这一点: https://www.youtube.com/embed/Ej0sss6cq14?start=1664&end=1800 - Pavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接