Les annotations de type Java 8 (JSR 308) permettent aux vérificateurs de type d'effectuer une analyse de code statique. Par exemple, The Checker Framework peut vérifier la nullité possible via @NonNull
annotations.@Rétention d'annotations de vérificateur de type Java
Divers projets définissent leurs propres annotations non nulle, par exemple:
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
- etc. (voir The Checker Framework Manual, section 3.7)
Pour ces annotations, je me attends @interface
d'avoir @Retention(RetentionPolicy.CLASS)
, car ils ne sont généralement pas nécessaires à l'exécution. Plus important encore, le code n'a aucune dépendance d'exécution sur la bibliothèque respective.
Alors que org.eclipse.jdt.annotation.NonNull
suit cette approche, la plupart des autres annotations non nulle, comme javax.annotation.Nonnull
(JSR 305) et org.checkerframework.checker.nullness.qual.NonNull
lui-même, ont @Retention(RetentionPolicy.RUNTIME)
. Y a-t-il une raison particulière pour le RetentionPolicy.RUNTIME
dans ces annotations? Clarification: Le Framework Checker prend en charge les annotations dans les commentaires pour des raisons de compatibilité ascendante. Cependant, l'utilisation de Java 8 pour éviter les dépendances à l'exécution semble être un hack sale.
Remarque associée pour les classes annotées moqueuses avec mockito (version 2.2.0): While RetentionPolicy. RUNTIME signifie qu'une annotation présente dans le binaire ne doit pas être disponible à l'exécution, https://bugs.openjdk.java.net/browse/JDK-8152174 provoque une exception NullPointerException dans Java 8 en se moquant d'une classe annotée pour laquelle le l'annotation n'est pas disponible sur le chemin de classe. –