[英]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
。 为什么? 我们尝试添加更多的空检查注释,发现:
@Nullable
是NullPointerTester
所需的全部。 诚然,对于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.