62 votes

Devrais-je utiliser Java8 / Guava Optional pour chaque méthode pouvant renvoyer null?

En option est utilisée pour représenter un objet nullable, Certaines utilisations de cette classe comprennent

  1. En tant que méthode de type de retour, comme une alternative à retourner null à
    indiquer qu'aucune valeur n'a été disponible
  2. La distinction entre "inconnu" (par exemple, n'est pas présent dans une carte) et "connu pour n'avoir aucune valeur" (présent dans la carte, avec une valeur
    Facultatif.absent())
  3. Pour envelopper nullable références pour le stockage dans une collection qui n'a pas soutien null (bien qu'il existe plusieurs autres approches à ce que devraient être considérés en premier)

Pour le premier cas, dois-je retourner en Option dans tous les nullable de retour de la méthode?

75voto

Edwin Dalorzo Points 19899

Quel est donc le problème avec l'Option?

La question que nous devons relever est la suivante: JDK 8 objets Facultatifs se débarrasser de références nulles? Et la réponse est un grand pas! Ainsi, les détracteurs immédiatement la question de sa valeur en demandant: "alors qu'est-elle bonne pour que l'on ne pouvait déjà le faire par d'autres moyens?

À la différence des langages fonctionnels comme SML o Haskell qui n'a jamais eu la notion de références nulles, en Java on ne peut pas simplement se débarrasser de la des références nulles qui ont historiquement existé. Cela permettra de continuer à exister, et ils ont sans doute leurs usages propres (pour n'en citer un exemple: logique tri-valuée).

Je doute que l'intention de la classe Optionnelle est à remplacer tous les nullable de référence, mais pour aider à la création de plus robuste Api dans laquelle il suffit de lire la signature d'une méthode pour nous dire si nous pouvons nous attendre à une valeur facultative ou non, et forcer le programmeur à utiliser cette valeur en conséquence. Mais en fin de compte, Option sera juste une autre référence, et sous réserve des mêmes faiblesses de toute autre référence dans la langue (ex: vous pouvez retourner une valeur null en Option). Il est bien évident que l'Option n'est pas destiné à sauver la journée.

Comment ces objets facultatifs sont supposées être utilisées ou si elles sont valables ou pas en Java a été le sujet d'un débat houleux dans le projet lambda liste de diffusion. De les détracteurs nous entendre intéressant arguments comme:

  • Le fait que d'autres alternatives existent ( c'est à dire IDES comme Ide et IDE Eclipse soutien d'un ensemble de propriétaires annotations pour l'analyse statique de la possibilité de valeur null, la JSR-305 avec des annotations comme @Nullable et @Non null).
  • Certains voudraient qu'il soit utilisable que dans le monde fonctionnelle, ce qui n'est pas tout à fait possible en Java puisque la langue ne dispose pas de nombreuses fonctionnalités existantes dans les langages de programmation fonctionnelle comme SML ou Haskell (c'est à dire le pattern matching).
  • D'autres soutiennent qu'il est impossible de rénovation préexistante code à utiliser cet idiome (c'est à dire la Liste.get(Object) qui continuera à retourner la valeur null).
  • Et certains se plaignent du fait que le manque de support de la langue pour les valeurs facultatives crée un scénario possible en Option qui pourrait être utilisé de façon uniforme dans l'Api, par la création d'incompatibilités, un peu comme ceux que nous aurons avec le reste de l'API Java qui ne peut pas être réparé à utiliser la nouvelle Option de la classe. C'est à peu près à ta question ici. Dans les langues avec support optionnel de type Ceylan, vous n'auriez même pas cette question.
  • Un argument irréfutable, c'est que si le programmeur invoque la méthode get dans un objet facultatif, si il est vide, il va soulever une NoSuchElementException, qui est à peu près le même problème que nous avons avec les valeurs null, juste avec une autre exception.

Donc, il semblerait que les avantages de l'Option sont vraiment discutable et sont probablement contraint à l'amélioration de la lisibilité et de l'exécution publique des contrats d'interface.

Je crois que l'adoption de cette Option fonctionnelle idiome est susceptible de rendre notre code plus sûr, moins prompt à null déréférencement des problèmes et de plus en plus robuste et moins sujette aux erreurs. Bien sûr, ce n'est pas une solution parfaite, car, après tout, en Option références peuvent également être à tort, null références, mais je m'attends à ce que les programmeurs en tenir à la convention de ne pas passer des références nulles lorsqu'un objet facultatif est prévu, à peu près comme nous aujourd'hui envisager une bonne pratique de ne pas passer d'une référence null où une collection ou un tableau est prévu, dans ces cas, la bonne est de passer un tableau vide ou de la collection. Le point ici est que nous avons maintenant un mécanisme dans l'API que nous pouvons utiliser pour rendre explicite le fait que pour une référence donnée, nous ne peuvent pas avoir de valeur à affecter à l'utilisateur est forcé, par l'API, pour vérifier que.

Citant Google Goyave de l'article à propos de l'utilisation des objets facultatifs:

"En plus de l'augmentation de la lisibilité qui vient donner un null nom, le plus grand avantage de l'Option est de son idiot-proof-ness. Il vous oblige à réfléchir activement sur l'absence de cas si vous voulez que votre programme à compiler à tous, depuis que vous avez activement déballer le En option et à l'adresse de cas".

Donc, je crois que c'est à chaque API concepteur de choisir la façon dont beaucoup qu'ils veulent faire dans l'utilisation de l'Option.

8voto

Răzvan Petruescu Points 175

Comme une observation, je pense que l'un des aspects les plus importants qui doivent être considérés lors de la création de l'architecture d'une application est de décider de la façon de traiter le "null problème". À cet égard, la première étape serait d'identifier de possibles "sources" de la valeur null. Par exemple, la base de données ou à des bibliothèques externes utilisés dans le projet. La prochaine étape serait à "contenir" le problème, à savoir, pour l'envelopper de code posant problème(utilisation Facultative), et donc bloquer la propagation de la valeur null dans l'ensemble du système, où la méfiance du code peut déclencher des Npe.
Pour répondre à ta question, ça dépend...la Plupart du temps, je dirais que c'est inutile, car il crée beaucoup de travail sans valeur (par exemple, je n'aurais pas l'usage facultatif pour les méthodes qui appeler d'autres méthodes privées à l'intérieur des classes ou des méthodes qui appellent des méthodes de colis-privé classes), mais le code qui existe à la mince frontière de différents "préoccupations" (ou couches) dans votre application, (la signature des interfaces/classes que vous utilisez pour interroger la banque de données, par exemple, ou pojo utilisé pour le transport de données que peut avoir la valeur null propriétés - Otd, ou, une description plus générale, publié Api des modules différents) devraient éviter de 'fuite' des valeurs null dans certains autres domaines, avec des préoccupations différentes.

8voto

Vlad Points 967

Comparé à Goyave, un problème gênant avec java.util.Optional est qu’il ne fournit pas une méthode comme

orElse(Optional<T>): Optional<T>

qui est par contre défini en com.google.common.base.Optional comme

or(Optional<T>): Optional<T>

L'absence de cette fonctionnalité spécifique limite les applications monadiques de Java 8 facultatif.

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