Je peux voir que @Nullable
et les @Nonnull
annotations pourraient être utiles pour empêcher les NullPointerException
s, mais elles ne se propagent pas très loin.
- L'efficacité de ces annotations diminue complètement après un niveau d'indirection, donc si vous n'en ajoutez que quelques-unes, elles ne se propagent pas très loin.
- Étant donné que ces annotations ne sont pas bien appliquées, il y a un risque de supposer qu'une valeur marquée par
@Nonnull
n'est pas nulle et par conséquent de ne pas effectuer de vérifications nulles.
Le code ci - dessous provoque un paramètre marqué par @Nonnull
être null
sans soulever de plaintes. Il jette un NullPointerException
quand il est exécuté.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
Existe-t-il un moyen de rendre ces annotations plus strictement appliquées et / ou de se propager davantage?
@Nonnull
lors de l'appel d'une @Nonnull
méthode avec une variable Nullable. Bien sûr, la conversion avec une annotation n'est pas possible dans Java 7, mais Java 8 ajoutera la possibilité d'appliquer des annotations à l'utilisation d'une variable, y compris les casts. Cela peut donc devenir possible à implémenter en Java 8.
(@NonNull Integer) y
est syntaxiquement possible, mais un compilateur n'est pas autorisé à émettre un code d'octet spécifique basé sur l'annotation. Pour les assertions d'exécution, de minuscules méthodes d'assistance sont suffisantes, comme indiqué dans bugs.eclipse.org/442103 (par exemple directPathToA(assertNonNull(y))
) - mais attention, cela ne fait qu'échouer rapidement. Le seul moyen sûr est d'effectuer une vérification réelle de null (plus, espérons-le, une implémentation alternative dans la branche else).
@Nonnull
et dont @Nullable
vous parlez, car il y a plusieurs annoations similaires (voir cette question ). Parlez-vous des annotations dans le package javax.annotation
?
@Nullable
ou@Nonnull
, mais s'ils en valent la peine, il est très "susceptible de