Java 8类型注释(JSR 308)允许类型检查器执行静态代码分析。例如,The Checker Framework可以通过@NonNull
注释来检查可能的无效。@ Java类型检查器注释的保留
各项目定义他们自己的非空注解,例如:
org.checkerframework.checker.nullness.qual.NonNull
edu.umd.cs.findbugs.annotations.NonNull
javax.annotation.Nonnull
javax.validation.constraints.NotNull
lombok.NonNull
org.eclipse.jdt.annotation.NonNull
- 等(见The Checker Framework Manual, section 3.7)
对于这样的注解,我预计@interface
有@Retention(RetentionPolicy.CLASS)
,因为通常不能在运行时需要他们。最重要的是,这些代码在相应的库上没有任何运行时依赖关系。
org.eclipse.jdt.annotation.NonNull
虽然如下这种方法中,大多数其它非空注解,像javax.annotation.Nonnull
(JSR 305)和org.checkerframework.checker.nullness.qual.NonNull
本身,有@Retention(RetentionPolicy.RUNTIME)
。在这些注释中是否有任何特别原因RetentionPolicy.RUNTIME
?
说明:Checker Framework支持注释中的注释以实现向后兼容。但是,仅仅为了避免运行时依赖而在Java 8中使用它们看起来就像是肮脏的黑客攻击。
mocking带有mockito(2.2.0版)的带注释的类的相关注意事项: While RetentionPolicy。 RUNTIME意味着二进制文件中存在的注释不必在运行时可用,https://bugs.openjdk.java.net/browse/JDK-8152174在嘲笑注释类时会在Java 8中导致NullPointerException,注释在类路径中不可用。 –