我可以看到 @Nullable
和 @Nonnull
注释可能会有助于防止NullPointerException
,但它们的作用范围有限。
- 这些注释的有效性在一级间接后完全降低,因此如果您仅添加了几个,它们的作用范围不会很远。
- 由于这些注释没有得到很好的执行,因此有一个危险,即假定带有
@Nonnull
标记的值不为null,并因此不执行空检查。
下面的代码导致一个被标记为@Nonnull
的参数为null
,而不引发任何投诉。 当运行该代码时,它会抛出一个NullPointerException
。
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
有没有办法使这些注释更严格执行和/或传播得更远?
@Nullable
或@Nonnull
的想法,但它们是否值得使用很可能会引发争议。 - Maarten Bodewes@Nonnull
方法时强制转换为@Nonnull
。 当然,在Java 7中无法使用注释进行转换,但是Java 8将增加将注释应用于变量的能力,包括强制转换。 因此,在Java 8中可能会实现这一点。 - Theodore Murdock(@NonNull Integer) y
,但编译器不允许基于注释发出任何特定的字节码。对于运行时断言,如在https://bugs.eclipse.org/442103中讨论的那样,小的帮助方法就足够了(例如,`directPathToA(assertNonNull(y))`)- 但请注意,这仅有助于快速失败。唯一安全的方法是执行实际的空检查(加上希望else分支中的替代实现)。 - Stephan Herrmann@Nonnull
和@Nullable
是哪些,因为有多个类似的注释(请参见**此问题**)。您是在谈论包javax.annotation
中的注释吗? - James Dunn