繁体   English   中英

为什么checkNotNull()没有用@Nonnull注释

[英]Why checkNotNull() is not annotated with @Nonnull

我发现不方便之处在于番石榴中的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定义的)。

很抱歉, 我们没有在任何地方使用@Nonnull 为什么? 我们尝试添加更多的空检查注释,发现:

  • 添加所有其他注释非常冗长。
  • @NullableNullPointerTester所需的全部。 诚然,对于Guava开发人员而言,这比Guava用户更为重要。
  • @Nullable似乎遇到了大多数问题。 我承认很难说在用户找到其他注释之前会捕获多少未检查的错误。

详细是最主要的。 它变得很疯狂,尤其是对于子类型化和参数化类型。 我们试图为注释选择一个最佳位置。 也许有一天我们会更改它。 但就目前而言,这就是事情按原样进行的原因。

(如果我们做了某些事情,我怀疑我们会尝试将@Nonnull为默认值,而是使用@CheckForNull作为例外。但是我还没有仔细研究它以确保我理解了正确的含义。)

@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注释参数,因为我们可能经常检查可为空的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM