Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,检查器框架可以通过注释检查可能的空值。@NonNull
各种项目定义了自己的NonNull注解,例如:
org.checkerframework.checker.nullness.qual.NonNulledu.umd.cs.findbugs.annotations.NonNulljavax.annotation.Nonnulljavax.validation.constraints.NotNulllombok.NonNullorg.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。