new - usar codigo html en java




¿Debería Java 8 getters devolver el tipo opcional? (4)

Después de investigar un poco por mi cuenta, he encontrado una serie de cosas que podrían sugerir cuándo es apropiado. La más autorizada es la siguiente cita de un artículo de Oracle:

"Es importante tener en cuenta que la intención de la clase Opcional no es reemplazar todas las referencias nulas . En su lugar, su propósito es ayudar a diseñar API más comprensibles para que al leer la firma de un método, pueda determinar si puede esperar un valor opcional. Esto lo obliga a desempaquetar activamente un opcional para tratar con la ausencia de un valor ". - ¿ oracle.com/technetwork/articles/java/… oracle.com/technetwork/articles/java/…

También encontré este extracto de Java 8 Opcional: Cómo usarlo

"Opcional no está destinado a ser utilizado en estos contextos, ya que no nos comprará nada:

  • en la capa de modelo de dominio (no serializable)
  • en DTOs (mismo motivo)
  • en parámetros de entrada de metodos
  • en los parámetros del constructor "

Lo que también parece plantear algunos puntos válidos.

No pude encontrar ninguna connotación negativa o señales de advertencia para sugerir que debería evitarse la Optional . Creo que la idea general es, si es útil o mejora la usabilidad de su API, úsela.

Optional tipo Optional introducido en Java 8 es algo nuevo para muchos desarrolladores.

¿Un método getter que devuelve el tipo Optional<Foo> en lugar del clásico Foo una buena práctica? Supongamos que el valor puede ser null .


Diría que, en general, es una buena idea usar el tipo opcional para valores de retorno que pueden ser anulables. Sin embargo, supongo que reemplazar los getters clásicos por tipos opcionales causará muchos problemas al trabajar con frameworks (por ejemplo, Hibernate) que se basan en las convenciones de codificación para los getters y setters.


Por supuesto, la gente hará lo que quiera. Pero teníamos una intención clara al agregar esta función, y no era un tipo de propósito general. Tal vez a muchas personas les hubiera gustado que lo hiciéramos. Nuestra intención era proporcionar un mecanismo limitado para los tipos de retorno de métodos de biblioteca donde era necesario que hubiera una forma clara de representar "ningún resultado", y el uso de un null para los mismos era muy probable que causara errores.

Por ejemplo, probablemente nunca debería usarlo para algo que devuelva una serie de resultados o una lista de resultados; en cambio, devuelve una matriz o lista vacía. Casi nunca debe usarlo como un campo de algo o un parámetro de método.

Creo que usarlo de forma rutinaria como valor de retorno para los captadores definitivamente sería un uso excesivo.

No hay nada de malo en Opcional que deba evitarse, simplemente no es lo que mucha gente desea, y por lo tanto estábamos bastante preocupados por el riesgo de un uso excesivo.

(Anuncio de servicio público: NUNCA llame a Optional.get menos que pueda probar que nunca será nulo; en su lugar, utilice uno de los métodos seguros como orElse o ifPresent . En retrospectiva, deberíamos haber llamado get algo como getOrElseThrowNoSuchElementException o algo que lo haya dejado muy claro. que este fue un método altamente peligroso que socavó todo el propósito de la Optional en primer lugar. Lección aprendida. (ACTUALIZACIÓN: Java 10 tiene Optional.orElseThrow() , que es semánticamente equivalente a get() , pero cuyo nombre es más apropiado. ))


Si está utilizando serializadores modernos y otros marcos que entienden Optional , he encontrado que estas directrices funcionan bien al escribir beans de Entity y capas de dominio:

  1. Si la capa de serialización (generalmente un DB) permite un valor null para una celda en la columna BAR en la tabla FOO , entonces el captador Foo.getBar() puede devolver Optional indicando al desarrollador que este valor puede esperarse que sea nulo y debe manejar esto. Si el DB garantiza que el valor no será nulo, el getter no debería envolver esto en un Optional .
  2. Foo.bar debe ser private y no Optional . Realmente no hay razón para que sea Optional si es private .
  3. El Foo.setBar(String bar) debe tomar el tipo de bar y no Optional . Si está bien usar un argumento null indíquelo en el comentario de JavaDoc. Si no está bien usar una IllegalArgumentException null o alguna lógica de negocios apropiada es, en mi humilde opinión, más apropiada.
  4. Los constructores no necesitan argumentos Optional (por razones similares al punto 3). Generalmente solo incluyo argumentos en el constructor que deben ser no nulos en la base de datos de serialización.

Para hacer que lo anterior sea más eficiente, es posible que desee editar sus plantillas IDE para generar captadores y las plantillas correspondientes para toString() , equals(Obj o) etc. o usar campos directamente para esos (la mayoría de los generadores IDE ya tienen nulos).





optional