@Nullable 注解用法

Posted

技术标签:

【中文标题】@Nullable 注解用法【英文标题】:@Nullable annotation usage 【发布时间】:2012-12-14 02:51:57 【问题描述】:

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

void foo(@Nullable Object obj)
 ... 

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

没有注解,输入仍然可以为空,所以我猜不只是它?

【问题讨论】:

从下面的答案中,我了解到注释表明空值是可以接受的,它的使用示例,我可以尝试的代码分析器,并且解释可能会有所不同。看看为什么这种格式很好?全方位 +1,尤其是在提出这个问题时。 哪个库在您的问题中提供@Nullable?是Checker? 见***.com/questions/4963300 【参考方案1】:

清楚地表明该方法接受空值,并且如果您覆盖该方法,您也应该接受空值。

它还可以作为FindBugs 等代码分析器的提示。例如,如果此类方法取消引用其参数而不首先检查 null,则 FindBugs 将发出警告。

【讨论】:

【参考方案2】:

这个注解常用来消除NullPointerExceptions@Nullable 表示这个参数可能是null。这种行为的一个很好的例子可以在Google Guice 中找到。在这个轻量级的依赖注入框架中,你可以看出这个依赖可能是null。如果您尝试在没有注释的情况下传递null,框架将拒绝完成它的工作。

更重要的是,@Nullable 可能与@NotNull 注释一起使用。在这里你可以find一些关于如何正确使用它们的提示。 IntelliJ 中的代码检查检查注释并帮助调试代码。

【讨论】:

【参考方案3】:

不同的工具可能会以不同的方式解释@Nullable 的含义。例如,Checker Framework 和 FindBugs 句柄 @Nullable differently。

【讨论】:

【参考方案4】:

当然,肯定有不同的想法,在我的世界里,我不能强制执行“从不传递 null”,因为我正在与无法控制的第三方打交道,比如 API 调用者、数据库记录、前程序员等......所以我很偏执并且防御方法。由于您使用的是 Java8 或更高版本,因此有比 if 块更简洁的方法。

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

您还可以通过将.orElse 交换为 orElseThrow(() -> new Exception("Dont' send a null")).

如果您不想使用@Nullable,它不会在功能上添加任何内容,为什么不直接使用mayBe... 命名参数,这样您的意图就很明确了。

【讨论】:

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

以上是关于@Nullable 注解用法的主要内容,如果未能解决你的问题,请参考以下文章

Spring 从0开始Spring5 新功能 - @Nullable 注解和函数式注册对象

loadNibNamed:(NSString *)name owner:(nullable id)owner options:(nullable NSDictionary *)options用法(示例

c# ?和?? 用法

#5 kotlin nullable 可空类型

PySpark:StructField(..., ..., False) 总是返回 `nullable=true` 而不是 `nullable=false`

nullable == null 和 nullable.hasvalue 之间有啥区别(如果有的话)[重复]