web-dev-qa-db-fra.com

Quelle annotation @NonNull Java Java à utiliser

Quelle est l'annotation mieux 'NonNull'?

"Meilleur" dans le sens de

  • Manière standard par exemple résistance future (par exemple, prise en charge par jdk standard, etc.)
  • Prise en charge des IDE (apparaît dans Java doc pour indiquer l'utilisation pour les développeurs)
  • Prise en charge par des outils d'analyse statique comme findbugs
  • Prise en charge de l'analyse d'exécution

Voici à quoi le monde ressemble actuellement - tout autre aperçu est apprécié:

  • javax.validation.constraints.NotNull ( Documents )
    + le package javax semble donc à l'épreuve du temps
    - Partie de JEE pas JSE. Dans JSE, il faut importer des bibliothèques supplémentaires .
    - Non pris en charge par les outils d'analyse statique (validation à l'exécution uniquement)

  • edu.umd.cs.findbugs.annotations.NonNull ( documents )
    - bibliothèque externe et non un package javax
    - obsolète depuis la version 3.X de findbugs
    + utilisé pour l'analyse statique (par findbugs et donc Sonar)

  • javax.annotation.Nonnull ( documents )
    + utilisé pour l'analyse statique (dans les findbugs)
    - JSR-305 est dormant/mort/inconnu comme sur la liste de diffusion fb indiquée. L'auteur Bill Pugh, même s'il lui a été directement demandé, n'a pas commenté l'état depuis des années ...

  • org.Eclipse.jdt.annotation_2.0.0 ( docs , intéressant présentation )
    + utilisé pour l'analyse statique (dans Eclipse pas dans les findbugs cependant)
    - propriétaire d'Eclipse (n'a pas essayé de les utiliser de façon autonome)

  • org.jetbrains.annotations.NotNull ( documents )
    + utilisé pour l'analyse statique (dans intelliJ pas dans findbugs cependant)
    - propriétaire d'IntelliJ (mais également accessible au public sous forme de bocal)

  • lombok.NonNull ( documents )
    + utilisé pour contrôler la génération de code
    - annotation propriétaire

  • Android.support.annotation.NonNull ( documents )
    + analyse statique dans Android studio
    - Android annotation propriétaire spécifique

  • org.checkerframework.checker.nullness.qual.NonNull ( documents )
    + JSR308 implémentation qui fait partie de Java8 (qui a introduit la possibilité d'écrire des annotations dans différentes parties de votre code, mais n'a pas introduit de nouvelles annotations)
    + utilisé pour le code statique (mais pas pour les findbugs) et analyse d'exécution
    - la bibliothèque externe semble cependant être approuvée par les gens Java

Actuellement, j'aurais tendance à Checker Framework mais j'ai hâte d'avoir d'autres vues ...

[clause de non-responsabilité] Je sais que la question a été posée ici mais n'a pas reçu de réponse (ou la réponse était incorrecte/incomplète/obsolète) [/ clause de non-responsabilité]

63
Lonzak

Il n'y a pas d'annotation @NonNull Standard. La création d'une telle annotation était l'objectif de la JSR 305, abandonnée depuis longtemps. Il n'y aura pas d'annotation @NonNull Standard tant que JSR 305 n'aura pas été reconstitué. Oracle n'a actuellement aucune intention de le faire. (Les annotations JEE n'entrent pas dans le champ d'application de la JSR 305.)

Pour la pérennité, le facteur le plus important à considérer est de savoir si l'annotation est une annotation de type ou une annotation de déclaration. Étant donné que @NonNull Indique une propriété de la valeur de la variable plutôt que de la variable elle-même, il doit s'agir d'une annotation de type. Être une annotation de type permet également d'écrire l'annotation sur plus d'emplacements, comme dans List<@NonNull String>.

Vous pouvez déterminer si une annotation est une annotation de type en consultant la méta-annotation @Target Dans la définition de l'annotation. Au moment d'écrire ces lignes, il semble que seules les versions de Checker Framework et Eclipse sont des annotations de type, donc je les choisirais plutôt que celles qui sont des annotations de déclaration. Notez que les développeurs de toutes les autres annotations peuvent également les mettre à jour pour être des annotations de type; Je ne connais pas leurs plans.

Le seul inconvénient est que l'utilisation d'une annotation de type nécessite l'utilisation d'un compilateur Java 8. Checker Framework possède des mécanismes pour permettre au code contenant ses annotations d'être compilé par un compilateur Java 7.

23
mernst