Nuestro team de trabajo ha estado mucho tiempo buscando soluciones a tu duda, te regalamos la soluciones y nuestro objetivo es resultarte de mucha ayuda.
Solución:
Hay una pequeña diferencia en su comportamiento. Objects.requireNonNullElse()
requiere que uno de los parámetros no seanullde lo contrario, un NullPointerException
es aventado.
String foo = null, bar = null;
Optional.ofNullable(foo).orElse(bar); //returns a null value
Objects.requireNonNullElse(foo, bar); //throws a NullPointerException
La diferencia conceptual entre elegir uno u otro es como se explica en su documentación. Se basa en el enfoque de un consumidor de API para elegir cuál de ellos se supone que debe utilizar de manera efectiva.
Optional
es un objeto contenedor que puede contener o no un objeto nonull valor.
Una variable cuyo tipo es
Optional
nunca debe ser en sí mismonull
; siempre debe apuntar a unOptional
instancia.Esta es una clase basada en valores; el uso de operaciones sensibles a la identidad (incluida la igualdad de referencia (==), el código hash de identidad o la sincronización) en instancias de Opcional puede tener resultados impredecibles y debe evitarse.
-
ofNullable
devuelve un
Optional
con un valor presente si el valor especificado no esnullde lo contrario un vacíoOptional
-
orElse
devuelve el valor si está presente de lo contrario, devuelve otro.
De ahí el siguiente comportamiento:
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
igual que atraviesa
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Objects
es una clase compuesta por static métodos de utilidad para operar en objetos, o verificar ciertas condiciones antes de una operación.
Estas utilidades incluyen null-seguro o null-métodos tolerantes para calcular el código hash de un objeto, devolviendo un string para un objeto, comparando dos objetos y comprobando si los índices o los valores de subrango están fuera de los límites.
-
requireNonNullElse
devuelve el primer argumento si es no-null y de otra manera el segundo argumento si es no-null
De ahí la diferencia de comportamiento:
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
que además evalúa internamente si requireNonNull("nonNull", "defaultObj")
y luego
=> returns "nonNull" since its a non-null value
ahora que atraviesa
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
Comprueba internamente si requireNonNull(bar, "defaultObj")
que entonces
=> throws a NullPointerException
Como también está documentado
throws NullPointerException
– si ambos obj sonnull
y defaultObj esnull