Con Java 8, he visto más y más artículos sobre el uso de Opción / Opcional. Entiendo lo que intentan representar, y veo muchos ejemplos de ellos que se utilizan como devoluciones. Sin embargo, lo que no veo es que se utilicen como argumentos de método / función en lenguajes que no tienen la sintaxis para los parámetros predeterminados / opcionales.
¿Hay alguna razón para no usarlo Optional
como argumento de método en el caso de que sepa que el argumento es algo que puede o no ser necesario? Aquí hay un ejemplo que podría pensar:
Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
java
functional-programming
java8
Nicholas
fuente
fuente
Optional
está destinado principalmente a valores de retorno que pueden estar ausentes. Otros usos son posibles, por supuesto, pero son engorrosos y probablemente de mal estilo.Respuestas:
Una de las razones es que, conceptualmente,
firstName
,middleName
, ylastName
son lógicamente una discusión, no tres. Son todas partes de un todo más grande, y uno puede imaginar que casi siempre se pasan juntas. En lenguajes funcionales, probablemente se pasarían como una tupla o registro; Java carece de esos, por lo que probablemente se agregarían a una clase de Nombre. Tenga en cuenta que si necesita componer funciones que toman y devuelven nombres completos, no podría hacerlo sin agregarlos; después de todo, solo puede devolver un valor.Tal vez simplemente no surja con mucha frecuencia que un valor sea opcional y tampoco sea parte de un todo más grande. Si la función requiere un cierto valor para hacer su trabajo, entonces esa función no debería aceptar un
Optional
. Si necesita encadenar operaciones que podrían no devolver un valor, abortandoNothing
si alguna función falla en el camino, puede encadenar llamadasflatMap
, y si desea fallar con una excepción, puede usarget()
en cualquier paso del camino o en el Fin de la cadena.Si un valor es realmente opcional y una función hace dos cosas diferentes en función de su presencia o ausencia, es un olor a código a menos que la función sea una envoltura de dos funciones más pequeñas que hacen una cosa cada una, y esa combinación particular de decisiones es muy común.
No creo que sea tanto que esté mal, ya que es un caso de uso relativamente poco común.
fuente
No hay muchos idiomas que no admitan argumentos predeterminados, por lo que este no es un uso común. Personalmente, creo que su uso no es terrible, pero no será Java idiomático. Java, muy intencionalmente, no tiene argumentos predeterminados, para forzar el uso de sobrecarga, lo que tiene la ventaja de que el compilador verifica sus argumentos en lugar de requerir
if
declaraciones dentro de la función.En otras palabras, hará dos versiones diferentes de la consulta: una con un segundo nombre y otra sin él. Si puede hacerlo de manera concisa, usar una opción es una buena idea. Si de todos modos es lo suficientemente detallado como para quererlo en dos funciones separadas, también puede usar la sobrecarga y hacerlo idiomático.
fuente