【发布时间】:2016-12-22 20:08:00
【问题描述】:
Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,The Checker Framework 可以通过 @NonNull 注释检查可能的 nullness。
各个项目都定义了自己的NonNull注解,例如:
org.checkerframework.checker.nullness.qual.NonNulledu.umd.cs.findbugs.annotations.NonNulljavax.annotation.Nonnulljavax.validation.constraints.NotNulllombok.NonNullorg.eclipse.jdt.annotation.NonNull- 等。 (见The Checker Framework Manual, section 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 框架支持 cmets 中的注释以实现向后兼容性。然而,在 Java 8 中使用那些只是为了避免运行时依赖似乎是一种肮脏的 hack。
【问题讨论】:
标签: java annotations retention checker-framework