Аннотации типа Java 8 (JSR 308) позволяют контролерам типов выполнять статический анализ кода. Например, The Checker Framework может проверять возможную нулевость с помощью аннотаций @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 - и т.д.. (см. Руководство по Framework 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 Framework поддерживает аннотации комментариев для обратной совместимости. Однако использование тех, что в Java 8, чтобы избежать зависимостей во время выполнения, похоже на грязный взлом.