我发现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
定义的)。
答案 0 :(得分:10)
We haven't used @Nonnull
anywhere,抱歉。为什么?我们尝试添加更多的空检查注释,我们发现:
@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
注释参数,因为我们可能经常检查可空变量。