@NonNull
注解检查可能的nullness。各种项目定义自己的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
- 等(参见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框架支持在注释中使用的注解以实现向后兼容。然而,仅为了避免运行时依赖而在Java 8中使用这些注解似乎是一种不好的hack方法。