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

时间:2011-12-05 07:55:16

标签: java guava

我发现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总是错误的。是否有任何特殊原因导致此前置条件未标记为@Nonull(即使它的参数是使用@Nullable定义的)。

2 个答案:

答案 0 :(得分:10)

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

  • 添加所有其他注释非常详细。
  • {li> @Nullable是我们NullPointerTester所需要的。不可否认,对番石榴开发者来说,这比Guava用户更重要。
  • @Nullable似乎遇到了大多数问题。我承认很难说在用户找到之前会有多少未经检查的错误。

冗长是主要的事情。它变得疯狂,特别是对于子类型和参数化类型。我们试图为注释选择一个最佳点。也许有一天我们会改变它。但就目前而言,这就是事情的原因。

(如果我们确实做了某些事情,我怀疑我们会尝试将@Nonnull作为默认设置,而使用@CheckForNull来代替例外。但我还是没有调查它以确保我的意思是对的。)

答案 1 :(得分:7)

使用@Nonnull注释其结果确实很有意思,因为checkNotNull()如果引用为null则抛出NPE,这意味着它永远不会返回null:< / p>

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

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

if(this.variations == null)

因为@Nonnull只适用于checkNotNull()的结果,但对其论点没有任何说明。请注意,我们不能使用@Nonnull注释参数,因为我们可能经常检查可空变量。