Аннотации типа Java 8 (JSR 308) позволяют проверять тип проверки статического кода. Например, The Checker Framework может проверить на наличие возможных nullness через @NonNull
аннотации.@ Версии аннотаций проверки типов Java
Различные проекты определяют свои собственные ненулевым аннотаций, например:
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
следует этому подходу, большинство других ненулевого аннотаций, как javax.annotation.Nonnull
(JSR 305) и org.checkerframework.checker.nullness.qual.NonNull
самих, имеет @Retention(RetentionPolicy.RUNTIME)
. Есть ли какая-то конкретная причина для RetentionPolicy.RUNTIME
в этих аннотациях?
Уточнение: Checker Framework поддерживает аннотации комментариев для обратной совместимости. Однако использование тех, что в Java 8, чтобы избежать зависимостей во время выполнения, похоже на грязный взлом.
Связанное примечание для насмешливых аннотированных классов с mockito (версия 2.2.0): Хотя RetentionPolicy. RUNTIME означает, что аннотация, содержащаяся в двоичном формате, не должна быть доступна во время выполнения, https://bugs.openjdk.java.net/browse/JDK-8152174 вызывает исключение NullPointerException в Java 8, когда высмеивает аннотированный класс, для которого аннотация недоступна в пути к классам. –