【问题标题】:Why checkNotNull() is not annotated with @Nonnull为什么 checkNotNull() 没有用 @Nonnull 注释
【发布时间】:2011-12-05 07:55:15
【问题描述】:

我发现 guava 中的 checkNotNull() 前置条件没有用 @Nonull 注释标记很不方便。考虑以下示例:

State(Set<Model> models, Set<Variation> variations) {
  this.models = checkNotNull(models);
  this.variations = checkNotNull(variations);

  if (this.variations == null) {
     throw new IllegalArgumentException();
  }
  this.engine = createEngine();
}

所以 IDE 无法发现 variations == null 始终为 false。是否有任何特殊原因导致此前提条件未标有@Nonull(即使它的参数是使用@Nullable 定义的)。

【问题讨论】:

  • 我可能会错过为 GitHub wiki 页面发送 PR 的选项,因为我自己会为此编写一些东西。但是由于我不能,有人可以添加至少一个类似“番石榴只在内部使用@Nullable,所以所有返回类型都假定但没有用@Nonull标记”(或类似):github.com/google/guice/wiki/UseNullable

标签: java guava


【解决方案1】:

We haven't used @Nonnull anywhere,对不起。为什么?我们尝试添加更多的空检查注释,我们发现:

  • 添加所有其他注释非常冗长。
  • @Nullable 是我们所需要的 NullPointerTester。诚然,这对 Guava 开发人员来说比 Guava 用户更重要。
  • @Nullable 似乎发现了大多数问题。我承认很难说其他注释在用户发现它们之前会发现多少未签入的错误。

冗长是主要的。它变得疯狂,尤其是子类型和参数化类型。我们试图为注释选择一个最佳位置。也许有一天我们会改变它。不过,就目前而言,这就是为什么事情就是这样的原因。

(如果我们确实做了某事,我怀疑我们会尝试将 @Nonnull 设为默认值,而将 @CheckForNull 用于例外情况。但我还没有仔细研究它以确保我有意思是对的。)

【讨论】:

  • 一些工具可能足够聪明,可以注意到 package-info 是用 @ParametersAreNonnullByDefault 注释的。
  • 与这个问题相关,我认为我们也需要@ReturnsAreNonnullByDefault,对吧?我不知道这是否存在。
  • 我们已将所有包的参数、字段和方法(返回值)默认设置为非空。对于后两者,我必须从 FindBugs 复制已弃用的注释。到目前为止,我对结果非常满意。在一个无疑会在以后咬我的举动中,我将@CheckForNull复制到私人@Nullable并禁止使用原始名称,因为后者的名称更符合意图,更容易输入,并且更具可读性。
【解决方案2】:

用@Nonnull 注释它的结果确实很有趣,因为如果引用是null,checkNotNull() 会抛出 NPE,这意味着它永远不会返回 null:

  @Nonnull
  public static <T> T checkNotNull(T reference) {
    if (reference == null) {
      throw new NullPointerException();
    }
    return reference;
  }

请注意,您需要将代码更改为:

if(this.variations == null)

因为@Nonnull 只适用于checkNotNull() 的结果,但对它的论点只字未提。请注意,我们不能使用 @Nonnull 注释参数,因为我们可能经常检查可空变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多