Аннотации типа 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, чтобы избежать зависимостей во время выполнения, похоже на грязный взлом.
