@Nullable注释用法

use*_*893 329 java annotations

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

void foo(@Nullable Object obj)
{ ... }
Run Code Online (Sandbox Code Playgroud)

这是什么意思@Nullable?这是否意味着输入可能是null?没有注释,输入仍然可以为空,所以我猜这不仅仅是它吗?

谢谢

JB *_*zet 350

它清楚地表明该方法接受空值,并且如果重写该方法,则还应接受空值.

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


Ada*_*der 81

这个注释通常用于消除NullPointerExceptions.@Nullable经常说这个参数可能是null.可以在Google Guice中找到此类行为的良好示例.在这个轻量级依赖注入框架中,您可以告诉这种依赖关系null.如果你试图传递null而没有注释,框架将拒绝做它的工作.

更多@Nullable可能与@NotNull注释一起使用.在这里,您可以找到一些如何正确使用它们的提示.IntelliJ中的代码检查检查注释并帮助调试代码.


rep*_*mer 17

不同的工具可能会不同地解释其含义@Nullable.例如,Checker FrameworkFindBugs处理方式@Nullable 不同.


Man*_*aga 8

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

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}
Run Code Online (Sandbox Code Playgroud)

.orElse您还可以通过交换到 来抛出一些异常orElseThrow(() -> new Exception("Dont' send a null"))

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

  • 使用Optional 代替“if”语句,这是一种反模式,因为它不必要地创建一个新对象。Optional 的创建者在这里提到了这一点:https://www.youtube.com/embed/Ej0sss6cq14?start=1664&end=1800 (12认同)