Cuando se usa la Optional
clase Java 8 , hay dos formas en que un valor se puede ajustar de forma opcional.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Entiendo que Optional.ofNullable
es la única forma segura de usar Optional
, pero ¿por qué Optional.of
existe? ¿Por qué no solo usar Optional.ofNullable
y estar seguro en todo momento?
java.util.Optional
: está disponible si está utilizando JDK 8 o posteriorofNullable()
nombradoof()
yof()
nombradoofNotNull()
Respuestas:
Su pregunta se basa en la suposición de que el código que puede arrojar
NullPointerException
es peor que el código que no puede arrojar . Esta suposición está mal. Si espera quefoobar
nunca sea nulo debido a la lógica del programa, es mucho mejor usarlo,Optional.of(foobar)
ya que verá unaNullPointerException
que indicará que su programa tiene un error. Si lo usaOptional.ofNullable(foobar)
yfoobar
senull
debe al error, su programa continuará funcionando incorrectamente en silencio, lo que puede ser un desastre mayor. De esta manera, un error puede ocurrir mucho más tarde y sería mucho más difícil de entender en qué momento salió mal.fuente
Optional.of(foobar)
". Esto parece un poco extraño: cuando sabemos que el valor no seránull
en ningún caso, ¿por qué no usar el valor en sí mismo, en lugar de envolverlo dentro de unOptional
?Optional
método según lo requiera la interfaz que está implementando (probablemente otros implementadores pueden devolver una opción vacía). O desea crear una colección / secuencia de opciones, algunas de las cuales están garantizadas como no nulas y otras no. O tiene una lógica condicional que crea un opcional en varias ramas y en una sola rama está seguro de que no es nulo.null
en este caso significa "Espero que foobar esté presente, pero debido a un error es nulo".Optional.isPresent() == false
significa que foobar no está presente, es decir, esto se espera, comportamiento legítimo.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
lalist
se espera que no contienennull
valores ...Además, si sabe que su código no debería funcionar si el objeto es nulo, puede lanzar una excepción utilizando
Optional.orElseThrow
fuente
String name = Objects.requireNonNull(nullName);
NullPointerException
cuando el problema es claramente una referencia que es,null
aunque no debería, sería un paso en la dirección equivocada.new NullNameException("meaningful msg")
Esto depende de los escenarios.
Digamos que tiene alguna funcionalidad comercial y necesita procesar algo con ese valor aún más, pero tener
null
valor en el momento del procesamiento lo afectaría.Entonces, en ese caso, puedes usar
Optional<?>
.fuente
Opcional debe usarse principalmente para resultados de Servicios de todos modos. En el servicio, sabe lo que tiene a mano y devuelve Opcional.of (someValue) si tiene un resultado y devuelve Opcional.empty () si no lo tiene. En este caso, algún valor nunca debe ser nulo y aún así, devuelve un Opcional.
fuente