Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,检查器框架可以通过注释检查可能的空值。@NonNull
各种项目定义了自己的NonNull注解,例如:
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
- 等(参见Checker 框架手册,第 3.7 节)
对于此类注释,我希望@interface
具有@Retention(RetentionPolicy.CLASS)
,因为在运行时通常不需要它们。最重要的是,代码对各自的库没有任何运行时依赖项。
虽然org.eclipse.jdt.annotation.NonNull
遵循这种方法,但大多数其他NonNull注释,如javax.annotation.Nonnull
(JSR 305) 及其org.checkerframework.checker.nullness.qual.NonNull
本身,都具有@Retention(RetentionPolicy.RUNTIME)
. RetentionPolicy.RUNTIME
这些注释中有什么特别的原因吗?
澄清:Checker 框架支持注释中的注释以实现向后兼容性。然而,在 Java 8 中使用它们只是为了避免运行时依赖似乎是一种肮脏的 hack。