Avec Java 8, j'ai vu de plus en plus d'articles sur l'utilisation de l'option/facultatif. Je comprends ce qu'ils essayant de représenter, et je vois de nombreux exemples d'entre eux étant utilisés comme retours. Toutefois, Ce que je ne vois pas, c'est qu'ils utilisent comme des arguments de méthode/fonction dans des langues qui n'ont pas la syntaxe des paramètres par défaut/facultatif.
Existe-t-il une raison pour ne pas utiliser Optional
comme un argument de méthode dans le cas où vous savez que l'argument est quelque chose qui peut être nécessaire ou non? Voici un exemple que je pouvais penser à:
Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
Une des raisons est que conceptuellement, firstName
, middleName
et lastName
sont logiquement n argument, pas trois. Ils sont toutes des parties d'un ensemble plus grand et on peut imaginer qu'ils sont presque toujours passés ensemble. Dans les langues fonctionnelles, ils seraient probablement passés comme un tuple ou un enregistrement; Java manque de celles-ci, ils seraient donc probablement agrégés dans une classe de noms. Notez que si vous aviez besoin de composer des fonctions prenant et de retourner les noms complets, vous ne seriez pas en mesure de les agréger. - Vous ne pouvez retourner qu'une seule valeur, après tout.
Peut-être que cela ne vient pas très souvent qu'une valeur est facultative et ne fait pas partie d'un ensemble plus grand. Si la fonction nécessite une certaine valeur pour faire son travail, cette fonction ne devrait pas accepter un Optional
. Si vous avez besoin de chaîner des opérations qui pourraient ne pas renvoyer une valeur, abandonner avec Nothing
si une fonction échoue, vous pouvez chaîner des appels à flatMap
, et si vous souhaitez échouer avec une exception Vous pouvez utiliser get()
à n'importe quelle étape du chemin ou à la fin de la chaîne.
Si une valeur est vraiment facultative et qu'une fonction fait deux choses différentes en fonction de sa présence ou de sa absence, c'est une odeur de code, sauf si la fonction est une enveloppe de deux fonctions plus petites qui font une chose chacune, et qu'une combinaison particulière de décisions est très courante.
Je ne pense pas que ce soit tellement que c'est faux car il s'agit d'un cas d'utilisation relativement peu commun.
Il n'y a pas beaucoup de langues qui ne prennent pas en charge les arguments par défaut, ce n'est donc pas une utilisation courante. Personnellement, je pense que votre utilisation n'est pas terrible, mais cela ne sera pas java idiomatique. Java== N'a pas intentionnellement des arguments par défaut, de forcer l'utilisation de surcharge à la place, ce qui présente l'avantage du compilateur vérifiant vos arguments au lieu de nécessiter des instructions if
à l'intérieur de la fonction .
En d'autres termes, vous allez faire deux versions différentes de la requête: une avec un deuxième prénom et un sans. Si vous pouvez le faire de manière concise, utiliser une option est une bonne idée. Si c'est suffisamment verbeux que vous le souhaitez en deux fonctions distinctes de toute façon, vous pouvez également utiliser la surcharge et le rendre idiomatique.