Java @可为空的注释用法

Java @可为空的注释用法,java,annotations,Java,Annotations,我看到java中的一些方法声明为: void foo(@Nullable Object obj) { ... } 这里的@Nullable是什么意思?这是否意味着输入可能是空的 如果没有注释,输入仍然可以为null,因此我想这不仅仅是它的问题?它清楚地表明,该方法接受null值,如果重写该方法,也应该接受null值 它还可以作为代码分析器的提示,例如。例如,如果这样一个方法在没有首先检查null的情况下取消引用其参数,FindBugs将发出警告。此注释通常用于消除NullPointerExce

我看到java中的一些方法声明为:

void foo(@Nullable Object obj)
{ ... }
这里的
@Nullable
是什么意思?这是否意味着输入可能是空的


如果没有注释,输入仍然可以为null,因此我想这不仅仅是它的问题?

它清楚地表明,该方法接受null值,如果重写该方法,也应该接受null值


它还可以作为代码分析器的提示,例如。例如,如果这样一个方法在没有首先检查null的情况下取消引用其参数,FindBugs将发出警告。

此注释通常用于消除
NullPointerException
@Nullable
表示此参数可能为
null
。这种行为的一个很好的例子可以在中找到。在这个轻量级依赖项注入框架中,您可以看出这个依赖项可能是
null
。如果您试图在没有注释的情况下传递
null
,框架将拒绝执行它的任务


更重要的是,
@Nullable
可以与
@NotNull
注释一起使用。在这里你可以找到一些正确使用它们的技巧。IntelliJ中的代码检查检查注释并帮助调试代码。

不同的工具可能会以不同的方式解释@Nullable的含义。例如,和handle
@Nullable

被授予,肯定有不同的想法,在我的世界里,我不能强制执行“永不传递null”,因为我正在与不可控的第三方打交道,如API调用方、数据库记录、前程序员等。。。因此,我偏执和防御性的方法。因为您使用的是Java8或更高版本,所以有一种比
if
块更干净的方法

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}
您还可以通过将
.orElse
交换到
orelsetrow(()->新异常(“不要发送空值”)


如果您不想使用@Nullable,因为它在功能上没有添加任何内容,那么为什么不使用
mayBe…
来命名参数呢?这样您的意图就很清楚了。

从下面的答案中,我了解到注释表明可以接受空值,以及使用它的示例,我可以试用代码分析器,解释可能会有所不同。明白为什么这种格式是好的吗+1全面,特别是问这个问题。在你的问题中,哪个库提供了
@Nullable
?如果这是一个反模式,因为它不必要地创建了一个新对象,那么可以使用Optional替换
语句。Optional的创建者在这里提到了这一点: