web-dev-qa-db-fra.com

Est-ce une bonne pratique d'utiliser Facultatif comme attribut dans une classe?

J'ai lu quelque chose sur le but de Optional (malheureusement je ne me souviens pas où) dans Java 8, et j'ai été surpris que l'auteur n'ait pas mentionné l'utilisation d'un Optional comme attribut dans une classe.

Étant donné que j'utilise des options optionnelles assez fréquemment dans mes cours, je me demandais si c'était une bonne pratique. Ou pourrais-je mieux utiliser des attributs normaux, qui renvoient null lorsqu'ils ne sont pas définis?

Note: Il peut sembler que ma question est basée sur l'opinion, mais j'ai l'impression que l'utilisation de Optional dans une classe n'est vraiment pas la voie à suivre (après avoir lu le message mentionné). Cependant, j'aime l'utiliser et je ne trouve aucun inconvénient à l'utiliser.

Exemple

Je voudrais donner un exemple à clarifier. J'ai une classe Transaction, qui est construite comme ceci:

public class Transaction {

     private Optional<Customer> = Optional.empty();
     ....

vs

public class Transaction {

     private Customer = null;
     ....

Lors de la vérification d'un Customer, je pense qu'il est plus logique d'utiliser transaction.getCustomer().isPresent() que transaction.getCustomer() != null. À mon avis, le premier code est plus propre que le second.

25
bashoogzaad

Optional de Java 8 était principalement destiné aux valeurs de retour des méthodes, et non aux propriétés des classes Java, comme décrit dans Facultatif dans Java SE 8 :

Bien sûr, les gens feront ce qu'ils veulent. Mais nous avions une intention claire lors de l'ajout de cette fonctionnalité, et ce ne devait pas être un type Maybe ou Some à usage général, autant que beaucoup de gens l'auraient souhaité. Notre intention était de fournir un mécanisme limité pour les types de retour de méthode de bibliothèque où il devait y avoir un moyen clair de représenter "aucun résultat", et en utilisant null pour une telle chose était extrêmement susceptible de provoquer des erreurs.

La clé ici est l'accent mis sur l'utilisation comme type de retour. La classe n'est définitivement pas destinée à être utilisée comme propriété d'un bean Java Bean. En témoigne que Optional n'implémente pas Serializable, ce qui est généralement nécessaire pour une utilisation généralisée en tant que propriété d'un objet.

37
Jesper

Je pense que c'est une question théorique.

La notion de valeurs optionnelles est venue du monde des langages fonctionnels. Ces langues prennent généralement également en charge la correspondance de modèles au niveau de la langue et vous permettent de faire correspondre des modèles sur la valeur facultative.

Dans les langages fonctionnels, les appels de fonction retournent généralement une valeur facultative sur laquelle un autre code pourrait correspondre.

Je n'ai jamais vu passer un argument facultatif, mais cela ne signifie pas que c'est une mauvaise pensée. Cela a l'air bizarre cependant.

1
Crazyjavahacking