Pourquoi checkNotNull () n’est pas annoté avec @Nonnull

J’ai trouvé gênant que la checkNotNull() en goyave ne soit pas marquée avec l’annotation @Nonull . Considérons l’exemple suivant:

 State(Set models, Set variations) { this.models = checkNotNull(models); this.variations = checkNotNull(variations); if (this.variations == null) { throw new IllegalArgumentException(); } this.engine = createEngine(); } 

Ainsi, IDE n’a pas pu constater que les variations == null sont toujours fausses. Existe-t-il des raisons particulières pour lesquelles cette condition préalable n’est pas marquée avec @Nonull (même si ses arguments sont définis avec @Nullable ).

Nous n’avons utilisé @Nonnull nulle part , désolé. Pourquoi? Nous avons essayé d’append d’autres annotations à vérification null et nous avons constaté que:

  • L’ajout de toutes les autres annotations est extrêmement détaillé.
  • @Nullable est tout ce dont nous avons besoin pour NullPointerTester . Certes, c’est plus important pour les développeurs de Guava que pour les utilisateurs de Guava.
  • @Nullable semble avoir attrapé la plupart des problèmes. J’admets qu’il est difficile de dire combien de bogues non cochés d’autres annotations auraient été capturés avant que l’utilisateur les ait trouvés.

La verbosité était la chose principale. Cela devient fou, surtout avec le sous-typage et les types paramétrés. Nous avons essayé de choisir un endroit idéal pour les annotations. Peut-être que nous le changerons un jour. Pour le moment, c’est pourquoi les choses sont comme elles sont.

(Si nous faisions quelque chose, je suppose que nous essaierions de faire de @Nonnull la valeur par défaut, en utilisant @CheckForNull pour les exceptions à la place. Mais je ne me suis pas suffisamment penché là-dessus pour m’assurer de bien comprendre le sens.)

Il serait en effet intéressant d’annoter son résultat avec @Nonnull , car checkNotNull() renvoie un NPE si la référence est null , ce qui signifie qu’elle ne renvoie jamais null :

  @Nonnull public static  T checkNotNull(T reference) { if (reference == null) { throw new NullPointerException(); } return reference; } 

Notez que vous devez changer votre code pour:

 if(this.variations == null) 

puisque @Nonnull ne s’appliquerait qu’au résultat de checkNotNull() , mais ne dit rien sur son argument. Notez que nous ne pouvons pas annoter l’argument avec @Nonnull , car nous @Nonnull souvent des variables nullables.