我可以看到@Nullable
和@Nonnull
注释可能有助于防止NullPointerException
s,但它们不会传播太远。
- 这些注释的有效性在一个间接级别之后会完全下降,因此,如果仅添加一些注释,它们的传播就不会太远。
- 由于这些注释的执行不正确,因此存在以下危险:假定标有的值
@Nonnull
不为空,因此不执行空值检查。
以下代码使标记@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
}
}
有没有办法使这些注释更严格地执行和/或进一步传播?
@Nonnull
在调用@Nonnull
带有可为空的变量的方法时需要强制转换为。当然,在Java 7中无法使用注释进行强制转换,但是Java 8将添加将注释应用于变量(包括强制转换)的功能。所以,这可能会成为可能在Java中8.实施
(@NonNull Integer) y
中语法上可以进行强制转换,但是不允许编译器基于注释发出任何特定的字节码。对于运行时断言,如bugs.eclipse.org/442103(例如directPathToA(assertNonNull(y))
)中所讨论的那样,微小的辅助方法就足够了-但是请注意,这只会帮助快速失败。唯一安全的方法是执行实际的空检查(希望在else分支中加上替代实现)。
@Nullable
or 的想法@Nonnull
,但是如果值得,那么“很可能引发辩论”