我看到java中的一些方法声明为:
void foo(@Nullable Object obj)
{ ... }
这里有什么意义@Nullable
?这是否意味着输入可能是null
?
没有注释,输入仍然可以为空,所以我猜这不仅仅是它?
我看到java中的一些方法声明为:
void foo(@Nullable Object obj)
{ ... }
这里有什么意义@Nullable
?这是否意味着输入可能是null
?
没有注释,输入仍然可以为空,所以我猜这不仅仅是它?
它清楚地表明该方法接受空值,并且如果您覆盖该方法,您也应该接受空值。
它还可以作为FindBugs等代码分析器的提示。例如,如果此类方法取消引用其参数而不首先检查 null,则 FindBugs 将发出警告。
此注解通常用于消除NullPointerExceptions
. @Nullable
说这个参数可能是null
. 这种行为的一个很好的例子可以在Google Guice中找到。在这个轻量级的依赖注入框架中,你可以看出这个依赖可能是null
. 如果您尝试在null
没有注释的情况下通过,框架将拒绝完成它的工作。
更重要的是,@Nullable
可能与@NotNull
注释一起使用。在这里,您可以找到有关如何正确使用它们的一些提示。IntelliJ 中的代码检查检查注释并帮助调试代码。
不同的工具可能解释@Nullable
不同的含义。例如,Checker Framework和FindBugs的处理@Nullable
方式不同。
诚然,肯定有不同的想法,在我的世界里,我不能强制执行“从不传递空值”,因为我正在与无法控制的第三方打交道,比如 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...
这样您的意图就很清楚了。