我看到Java中有一些方法的声明:
void foo(@Nullable Object obj)
{ ... }
这里的@Nullable
是什么意思?它是否意味着输入可以是null
?
没有这个注解,输入仍然可以为null
,所以我猜这不是全部内容?
我看到Java中有一些方法的声明:
void foo(@Nullable Object obj)
{ ... }
这里的@Nullable
是什么意思?它是否意味着输入可以是null
?
没有这个注解,输入仍然可以为null
,所以我猜这不是全部内容?
这表明该方法接受null值,如果你重写了该方法,也应该接受null值。
它还作为代码分析器的提示,例如像FindBugs这样的工具。例如,如果这样的方法在未先检查null的情况下对其参数进行解引用,则FindBugs将发出警告。
这个注解通常用于消除 NullPointerException(空指针异常)
。 @Nullable(可为空)
表示此参数可能为 null
。一个很好的例子可以在 Google Guice 中找到。在这个轻量级依赖注入框架中,您可以告诉它这个依赖可能是 null
。如果您尝试传递未经注释的 null
,该框架将拒绝执行其工作。
此外,@Nullable(可为空)
可以与 @NotNull(不可为空)
注解一起使用。在这里,您可以找到一些有关如何正确使用它们的提示。 IntelliJ 中的代码检查会检查这些注解并帮助调试代码。
毫无疑问,有着不同的思维方式。在我的世界里,我不能强制执行“永远不传递null”的法则,因为我要处理无法控制的第三方,如API调用者、数据库记录、前任程序员等等... 因此,我的做法是极度谨慎和防御性的。如果你使用的是Java8或更高版本,则有比if块更简洁的方法。
public String foo(@Nullable String mayBeNothing) {
return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}
您还可以通过将 .orElse
替换为 orElseThrow(() -> new Exception("不要发送null"))
来在其中引发一些异常。
如果您不想使用 @Nullable(没有增加任何功能),为什么不只是使用 mayBe...
命名参数,这样您的意图就清晰了。
if
语句的替代方案是一种反模式,因为它会不必要地创建一个新对象。Optional 的创建者在这里提到了这一点:
https://www.youtube.com/embed/Ej0sss6cq14?start=1664&end=1800 - Pavel
@Nullable
注释的库是哪个?是Checker框架吗? - 8bitjunkie