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