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