2017-05-29 4 views
3

L'une des variables membres de la chaîne de ma classe est Facultative. Est-il logique de le marquer avec l'annotation Lombok @NonNull?Marquage de la variable membre facultative comme NonNull

Je voudrais poser la même question dans le cas où la variable membre est Map au lieu de String. La réponse changera-t-elle?

+0

Si vous l'annotez avec '@ NonNull', vous devrez toujours l'initialiser même si vous n'en avez pas besoin. Je pense que ce n'est pas trop mal concernant l'utilisation de la mémoire. la même chose irait pour n'importe quel type de données que je penserais – XtremeBaumer

+0

N'a pas obtenu cette partie - "je penserais que ce n'est pas trop mauvais concernant l'utilisation de la mémoire". Je pensais que si je le faisais NonNull aiderait à éviter le contrôle nul, mais en suivant cette logique, tous les champs (autres que les primitives) devraient être marqués NonNull. Aussi marqué avec NonNull ne signifie pas qu'il doit être initialisé à chaque fois ... comme je peux donner la valeur par défaut .. non? de sorte que je n'ai pas à l'initialiser explicitement par le constructeur – Andy897

+0

s'il vous plaît dites-nous quel 'NonNull' vous utilisez. si c'est son propre lombok, alors vous avez une autre annotation pour les valeurs par défaut. en ce qui concerne le point que vous n'avez pas compris: si vous initialisez une variable, vous n'avez pas besoin que votre objet croisse en taille (un peu/octet).cela signifierait que vous perdriez de la mémoire et plus vous auriez d'objets, plus vous perdriez de mémoire – XtremeBaumer

Répondre

2

Le point principal facultatif est de rendre l'API fluide. Le champ n'est pas et ne devrait pas être une partie de l'API. Quelle est la différence pour vous entre Optional<Object> obj et Object obj dans les champs? Les deux champs peuvent être annotés avec @NotNull. L'annotation d'un champ avec @NotNull vous donnera le même résultat que l'annotation d'un Optional mais sans aucun appel supplémentaire comme ifPresent(). Si vous souhaitez utiliser Optional pour appliquer des opérations de chaînage à un champ, utilisez Optional de manière incorrecte. Il n'y a aucune raison d'utiliser Optional dans le champ.

Vous pouvez lire plus dans la liste de diffusion openjdk optional discussion.

Avoir en option permet de faire API couramment mail.openjdk

1

Oui, vous devez marquer toutes les variables Optional comme @NonNull.

Une variable de type facultatif ne doit jamais être nulle. Début de rules about use of Optional de Stuart Marks:

  1. Ne jamais, jamais, utiliser null pour une variable optionnelle ou une valeur de retour.

Si vous écrivez @NonNull, vous obtenez une aide d'outil pour vous assurer de ne pas enfreindre cette règle importante. Si vous n'écrivez pas @NonNull, alors vous n'avez que votre propre discipline personnelle pour vous empêcher de faire une erreur, et les clients peuvent également faire une erreur.

Par conséquent, vous devez écrire @NonNull, qui sert de documentation lisible par machine et vérifiée par une machine pour que la variable ne soit jamais nulle.

Ceci s'applique non seulement aux champs (variables membres), mais partout où vous utilisez Optional.

+1

Mais lisez aussi la règle 6: Évitez d'utiliser Optional dans les champs, les paramètres de méthode et les collections. –

+0

Oui, lisez également les autres règles. Cependant, ils ne sont pas pertinents à la question initiale. Si vous avez un champ de type optionnel, il devrait être '@ NonNull'. – mernst