Es el uso de Optional.ofNullable como un reemplazo para el operador ternario una buena práctica?

votos
7

Considere el uso de esta expresión:

String hi = Optional.ofNullable(sayHi()).orElse(-);

que corresponde efectivamente a esta expresión ternaria:

String hi = sayHi() != null ? sayHi() : -;

Es este uso de Optional.ofNullableun método de llamar a una buena práctica? O simplemente adicional detallado de codificación?


Reconozco que Optional.ofNullableen realidad crea una variable y evita llamar al sayHi()método dos veces. Para evitar este problema en realidad se podría crear una variable adicional, pero esto se suma a la verbosidad de la opción ternario:

String hi = sayHi();
hi = hi != null ? hi : -;

Por otra parte Optional.ofNullablecrea en caso de hino ser nullun extra de Optionalobjeto. Por lo que no es segura más sobrecarga a la misma.

Por lo tanto parece que hay algunas ventajas y desventajas de usar este tipo de construcción para reemplazar el constructor ternaria.


Por cierto: esta es la implementación de Java 8 de Optional.ofNullable:

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}
Publicado el 27/11/2018 a las 16:57
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
11

Cada vez que lo pienso de utilizar la API opcional para un propósito específico Siempre les recuerdo a mi mismo de lo que se pretendía hacer y por qué fue traído en el JDK y decir

Opcional en la intención de proporcionar un mecanismo limitado para este tipo de retorno del método de la biblioteca, donde hay una clara necesidad de representar “ningún resultado” y donde el uso de nulo para este es abrumadoramente probable que cause errores - Stuart Marcas

Opcional, está orientada sobre un tipo de retorno que podría o no podría tener un valor de retorno.

Con el uso de esta construcción como en este ejemplo específico de la suya causas justas de asignación de memoria adicional y los gastos generales de GC.

Me gustaría mantener las cosas simples y en lugar de hacer lo siguiente:

String hi = sayHi();
if(hi == null) hi = “-“;
...
Respondida el 27/11/2018 a las 17:15
fuente por usuario

votos
9

En el JDK 9 o posterior, utilice la siguiente:

String hi = Objects.requireNonNullElse(sayHi(), "-");

Esto evita tener que repetir sayHi()si se utiliza un operador ternario, o para asignar su valor a una variable local que se reutiliza en el ternario. Podría ser una pequeña mejora. También deja de lado la cuestión de si se debe utilizar Optional. :-)

Respondida el 29/11/2018 a las 07:17
fuente por usuario

votos
6

Es este uso de Optional.ofNullableun método de llamar a una buena práctica?

Conceptualmente , es una mala práctica. La idea básica consiste en representar la ausencia de un valor de retorno, no envolver todo lo que podría ser null. Estoy totalmente en contra de este uso.

O simplemente adicional detallado de codificación?

A mi me parece como un intento fallido de hacer que el código más de moda. ( "Mira, estamos utilizando flamante Optionaldesde Java 8!")

Yo prefiero la legibilidad y claridad sobre la concisión.

Este Optinaluso no proporciona claridad, pero plantea preguntas:

¿Por qué se coloca la variable?
¿Qué vas a hacer con esto Optional?
Va a ser utilizado / regresó a continuación?

No da la brevedad, ya sea: su segunda línea es aún más corto.

Para evitar este problema en realidad se podría crear una variable adicional, pero esto se suma a la verbosidad de la opción ternaria.

No están creando una variable adicional. La versión de una línea podría ser:

String hi = (hi = sayHi()) != null ? hi : "-";

Sin embargo, su sugerencia de dos líneas es absolutamente bien:

String messageContent = sayHi();
String hi = messageContent != null ? messageContent : "-";
Respondida el 27/11/2018 a las 17:16
fuente por usuario

votos
5

Si vas a permitir que Optionalen su flujo de trabajo, entonces debería considerar la modificación del sayHi()método para que devuelva Optional<String>lo que hará que el resultado más elegante:

hi = sayHi().orElse("-");

Si no desea introducir Optionalen su flujo de trabajo (ya que crear un objeto adicional de contener el valor opcional), entonces es mejor quedarse con cheques nulos simples y el operador ternario.

Con respecto a los costes de funcionamiento de Optional(como el aumento de la recolección de basura), que había necesidad de un perfil de su solicitud y decidirá si es o no era una preocupación real.

Además, si está interesado principalmente en la Stringcontinuación, ser conscientes del Objects.toString(Object, String)método que devuelve un valor por defecto si el objeto es nulo:

hi = Objects.toString(hi, "-");

Esto es más ordenado y más elegante que escribir el código manualmente.

Respondida el 27/11/2018 a las 17:13
fuente por usuario

votos
0

En resumen: evitar el Optionaltipo. El argumento principal para Optionalel tipo de retorno es, "Es demasiado fácil para que los clientes se olvidan de manejar la posibilidad de un valor de retorno nulo. OptionalEs feo y en su cara, por lo que un cliente es menos probable que se olvide de manejar la posibilidad de un retorno vacío valor. en todos los demás, los programadores deben continuar utilizando las referencias normales, que podrían ser nulo ".

Escribí una discusión de los pros y los contras de la utilización de Java OptionalTipo: Nada es mejor que el tipo opcional .

Respondida el 29/11/2018 a las 00:31
fuente por usuario

votos
0

Creo que es sobre todo una cuestión de gusto personal.

Desde mi punto de vista sería más significativo para simplemente devolver una Optional<String>y permitir que el acuerdo llamante con un valor faltante.

Opcional, siendo un tipo monádico, se puede aprovechar para conseguir más que sólo un valor alt.

En el otro extremo de su operador parece concisa suficiente, si se usan sistemática que podría ser práctico.

No creo que el rendimiento es un gran problema aquí.

Respondida el 27/11/2018 a las 17:24
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more