Java 8 Opcional. ¿Por qué de y de Nullable?
java-8 optional (6)
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué usar Optional.of sobre Optional.ofNullable? 4 respuestas
- Usos de las 13 respuestas opcionales
- ¿Hay una razón real para usar Optional.of ()? 8 respuestas
Tengo una pregunta con respecto a la Optional Java 8, cuyo propósito es abordar las excepciones NullPointerException
.
La pregunta es, ¿cuál es la razón para que ambos tipos nos permitan elegir:
Optional.of(T value) <-----non-null value, null value will throw NPE
Optional.ofNullable(T value) <----- nullable value
Porque lo que espero es, cuando uso:
Optional.of(nullValue);
No lanzará una NullPointerException
.
Amplié mi pregunta después de algunas respuestas:
¿Por qué las personas optarían por Opcional en lugar de lo normal en if-else
?
¿Por qué las personas optarían por el método opcional en lugar del método normal if-else para la comprobación nula?
El punto principal de la clase Optional<T>
es proporcionar una media para realizar operaciones de mapeo seguras nulas .
employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)
La expresión anterior puede reemplazar una cascada de sentencias if-else
en una sola expresión legible.
Optional.of
proporciona una aserción para que el argumento dado sea un valor null-null
, de lo contrario, puede optar por Optional.ofNullable
si no está seguro de la entrada.
Le recomiendo que lea el Optional para la clase Optional<T>
opcional para obtener más métodos de encadenamiento opcionales que puede usar para su ventaja.
El propósito de la Opcional es abordar la excepción
NullPointerException
Sí, lo es, pero en el momento de uso no en la creación.
Entonces, cuando recibe una Optional
de un método, puede evitar NPE utilizando los métodos Optional.ifPresent
, Optional.orElse
, Optional.orElseGet
y Optional.orElseThrow
.
Pero este no es el caso cuando creas un Opcional. Dado que es su propio método, debe saber si el objeto es anulable o no.
El punto principal de Opcional es proporcionar un medio para que una función devuelva un valor para indicar la ausencia de un valor de retorno . Vea esta discusión . Esto permite a la persona que llama continuar con una cadena de llamadas de métodos fluidos.
Stuart Marks
Por favor, lea este post para una explicación más detallada.
Creo que es bastante simple y claro con Javadoc:
Optional.of(T value)
se utiliza cuando está seguro de que nunca hay un valor null
y en caso de que se produzca un valor nulo que el programa lanza la excepción NullPointerException
y la considera un error.
Optional.ofNullable(T value)
se usa cuando sabe que puede haber un valor null
y, en caso de que su programa se comporte normalmente.
Después de leer algunas respuestas y comentarios, creo que falta esta explicación. Considere un método como
public Optional<String> name(Customer c) {
return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
}
Aquí desea lanzar una NullPointerException
si el cliente no es nuevo y se supone que tiene un nombre; su código es inconsistente si eso es null
alguna vez. Sin embargo, es posible que el nombre aún no exista si el cliente es nuevo, por ofNullable
tanto, de ofNullable
en ese caso y el método devuelve Optional
.
El javadoc de Optional.of
lee eso explícitamente:
@throws NullPointerException if value is null
y ahí es donde el requisito de manejar los casos según lo esperado por usted entra en escena con el uso de Optional.ofNullable
que es un pequeño bloque de código como:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value); // ''Optional.of''
}
Dicho esto, la decisión de elegir uno sobre el otro aún residirá en el diseño de la aplicación como si su value
pudiera ser null
o no .
En su parte de expectativa, eso no era para lo que realmente se pretendía el Optional
. La nota de la API aclara esto aún más (formateo mío):
Optional
está destinado principalmente para su uso como un tipo de retorno de método donde existe una clara necesidad de representar "ningún resultado" y donde el uso de unnull
es probable que cause un error. Una variable cuyo tipo esOptional
nunca debe sernull
; siempre debe apuntar a una instanciaOptional
.
El propósito de Optional es abordar la excepción NullPointerException.
Aparte : Solo para decirlo claramente, que la elección, por supuesto, le permitiría definir si un NPE debe lanzarse en tiempo de ejecución o no. Sin embargo, no está determinado en el momento de la compilación.
-
Optional.ofNullable
es un contenedor alrededor de las API existentes que pueden devolver unnull
. Usted lo llamaría como un consumidor de una API. -
Optional.of/Optional.empty
es para el nuevo código escrito conOptional
en mente. Devolvería unaOptional
creada conof/empty
como proveedor de una API.