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

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

void foo(@Nullable Object obj)
{ ... }

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

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

【问题讨论】:

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

标签: java annotations


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      不同的工具可能会以不同的方式解释@Nullable 的含义。例如,Checker FrameworkFindBugs 句柄 @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... 命名参数,这样您的意图就很明确了。

        【讨论】:

        猜你喜欢
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多