1166 votes

Qui @NotNull annotation Java dois-je utiliser?

Je suis à la recherche pour rendre mon code plus lisible ainsi que de l'utilisation de l'outillage comme IDE code de l'inspection et/ou d'analyse de code statique (FindBugs et Sonar) pour éviter NullPointerExceptions. De nombreux outils semblent incompatibles les uns avec les autres" @NotNull/@NonNull/@Nonnull d'annotation et d'une liste de tous dans mon code serait terrible à lire. Toutes les suggestions de laquelle est la "meilleure"? Voici la liste des équivalents annotations que j'ai trouvé:

  • javax.validation.constraints.NotNull
    Créé pour la validation d'exécution, pas d'analyse statique.
    la documentation

  • edu.umd.cs.findbugs.annotations.NonNull
    Utilisé par Findbugs analyse statique et, par conséquent, Sonar
    la documentation

  • javax.annotation.Nonnull
    Cela peut fonctionner avec Findbugs trop, mais JSR-305 est inactif.
    source

  • com.intellij.annotations.NotNull
    Utilisé par l'IDE IntelliJ IDEA pour l'analyse statique.
    la documentation

  • lombok.NonNull
    Utilisé pour contrôler la génération de code dans le Projet de Lombok.
    Espace réservé à l'annotation car il n'y a pas de norme.
    source, la documentation

175voto

luis.espinal Points 4145

Je ne voudrais pas utiliser tout ce qui n'est pas sous l' javax de l'espace de noms à tous (même si j'aime ce que Lombok et IntelliJ sont en train de faire). Sinon, vous pourriez être la création d'une dépendance à quelque chose d'autre que ce que le run-time vous donne quelque chose qui est à peu près de la sémantique. Peut-être que pour certains projets, c'est ok, mais ce serait un deal-breaker pour moi.

Je voudrais utiliser javax.validation.constraints.NotNull parce que c'est déjà ici avec Java EE 6.

L' javax.annotation.NonNull peut-être pas ici jusqu'à ce que Java 8 (comme Stephen souligné). Et les autres ne sont pas annotations standard.

Il aurait été agréable si les annotations ont été extensible. De cette façon, vous pouvez définir votre propre non-null d'annotation héritant/étendant à partir de rien. Puis, quand les normes d'obtenir aplanies, tout ce que vous avez à faire serait de redéfinir votre propre annotation.

Malheureusement, ce n'est pas le cas.

96voto

Bert F Points 27237

J'aime beaucoup le Vérificateur de Cadre, qui est une implémentation de type annotations (JSR-308), qui est utilisé pour mettre en œuvre défaut pions comme un nullness checker. Je n'ai pas vraiment essayé de tout les autres à offrir toute comparaison, mais j'ai été content de cette mise en œuvre.

Je ne suis pas affiliés avec le groupe qu'offre le logiciel, mais je suis un fan.

Quatre choses que j'aime à propos de ce système:

  1. Il a un défaut pions pour nullness (@Nullable), mais aussi a ceux de l'immuabilité et de formation (et d'autres). J'utilise le premier (nullness) et que j'essaie de faire en utilisant le second (l'immuabilité/IGJ). J'essaie à la troisième, mais je ne suis pas certain quant à l'utilisation à long terme encore. Je ne suis pas convaincu de l'utilité générale des autres pions, mais son bon de savoir que le cadre lui-même est un système pour la mise en œuvre d'une variété de nouvelles annotations et de dames.

  2. Le paramètre par défaut pour nullness vérification fonctionne bien: Non nulle, à l'exception des locaux (NNEL). Fondamentalement, cela signifie que, par défaut, le vérificateur traite everyhing (variables d'instance, les paramètres de la méthode, les types génériques, etc) à l'exception des variables locales comme si ils ont un @Non le type par défaut. Par la documentation:

    Le NNEL défaut conduit le nombre le plus explicite des annotations dans votre code.

    Vous pouvez définir une valeur par défaut différente pour une classe ou d'une méthode si NNEL ne fonctionne pas pour vous.

  3. Ce cadre vous permet d'utiliser avec sans créer une dépendance sur le cadre en plaçant vos annotations dans un commentaire: par exemple, /*@Nullable*/. C'est agréable car vous pouvez annoter et de vérifier une bibliothèque ou d'un code partagé, mais encore être en mesure d'utiliser cette bibliothèque partagée codé dans un autre projet qui n'utilise pas le cadre. C'est une fonctionnalité intéressante. J'ai pris l'habitude de l'utiliser, même si j'ai tendance à activer le Vérificateur de Cadre sur tous mes projets.

  4. Le cadre a une façon d' annoter les Api que vous utilisez et qui ne sont pas déjà annoté pour nullness en utilisant des fichiers stub.

59voto

Sam Barnum Points 5019

J'utilise l'Ide, parce que je suis très concerné par l'Ide, l'essoufflement des choses qui pourraient produire un NPE. Je suis d'accord que c'est frustrant de ne pas avoir d'annotation standard avec le JDK. On parle de l'ajout de lui, il pourrait le faire en Java 7. Auquel cas il y aura un plus grand choix!

33voto

Stephen C Points 255558

Selon la Java 7 liste des fonctionnalités de la JSR-308 annotations de type sont reportés à Java 8. La JSR-305 annotations ne sont même pas mentionnés.

Il y a un peu d'info sur l'état de la JSR-305 dans une annexe de la dernière JSR-308 projet. Cela comprend l'observation que la JSR-305 annotations semblent être abandonnés. La JSR-305 page affiche également comme "inactif".

Dans le même temps, la pragmatique réponse est d'utiliser les types d'annotations qui sont pris en charge par les plus largement utilisés des outils ... et être prêt à modifier si la situation change.


En fait, la JSR-308 ne définit pas toutes les annotations de types/classes, et on dirait qu'ils pensent que c'est hors de portée. (Et ils ont raison, compte tenu de l'existence de la JSR-305).

Toutefois, si la JSR-308 ressemble vraiment à le faire dans Java 8, il ne m'étonne pas, si l'intérêt de la JSR-305 relancé. Autant que je sache, la JSR-305 équipe n'a pas officiellement abandonné leur travail. Ils ont simplement été tranquille pendant 2 ans.

Il est intéressant de noter que le projet de Loi Pugh (le tech lead pour la JSR-305) est l'un des gars derrière FindBugs.

28voto

James Wald Points 6541

Pour Android les projets que vous devez utiliser android.support.annotation.NonNull et android.support.annotation.Nullable. Ces et d'autres utiles Android, les annotations sont disponibles dans la Bibliothèque de prise en charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X