Como sabes, java.util.Objects
es
Esta clase consta de métodos de utilidad estáticos para operar con objetos.
Uno de esos métodos es Objects.isNull()
.
Tengo entendido que Objects.isNull()
eliminaría la posibilidad de asignar accidentalmente un valor nulo al objeto omitiendo el segundo =
.
Sin embargo, la nota de API dice:
Este método existe para ser utilizado como predicado, filtro (Objects :: isNull)
¿Habría alguna razón / circunstancia por la que debería usar object == null
over Objects.isNull()
en una declaración if ?
¿Debería Objects.isNull()
limitarse exclusivamente a los predicados?
if(null == variable)
consistente ...variable
es unBoolean
.Respuestas:
Si observa el código fuente del
IsNull
método,/* Returns true if the provided reference is null otherwise returns false.*/ public static boolean isNull(Object obj) { return obj == null; }
Es lo mismo. No hay diferencia. Para que puedas usarlo de forma segura.
fuente
== null
enif
, pero isNull es de gran uso en las expresiones lambda.Objects.isNull
está diseñado para su uso dentro del filtrado lambda de Java 8.Es mucho más fácil y claro escribir:
que escribir:
.stream().filter(x -> x == null).
Dentro de una
if
declaración, sin embargo, cualquiera funcionará. El uso de== null
probablemente sea más fácil de leer, pero al final se reducirá a una preferencia de estilo.fuente
Mira la fuente:
public static boolean isNull(Object obj) { return obj == null; }
Para verificar los
null
valores, puede usar:Objects.isNull(myObject)
null == myObject // avoids assigning by typo
myObject == null // risk of typo
El hecho de que
Objects.isNull
esté destinado aPredicate
s no le impide usarlo como se indicó anteriormente.fuente
=
lugar de==
(no se compilaría a menos que sea unBoolean
contenedor que acepte nulos , sea justo)Boolean
contenedores que aceptan valores NULL en Java. Esto es bastante raro de hecho (y dará advertencias al compilador cuandonull
se verifique una asignación como si fuera una condición), pero no imposible.Sí, una razón es mantener el código simple. Dentro de si la declaración
object == null
es clara y bien conocida. No puede dar lugar a ningún mal comportamiento si, por ejemplo, hay un error tipográfico.Si se omite un
if (object = null) {}
con , no se compilará o generará una advertencia en caso de objeto. En realidad, no hay razón para usar over dentro de la declaración if . Aquí están las dos variantes una al lado de la otra:=
Boolean
Objects.isNull(object)
object == null
if (object == null) { } if (Objects.isNull(object)) { }
Se podría decir que sí, se limita exclusivamente a Predicados, aunque no hay ningún obstáculo técnico para utilizarlo en
Objects.isNull()
todas partes.Desde el
public static boolean isNull(Object obj)
javadoc del método:Entonces, si usa el método como no un predicado, en realidad está usando una expresión más compleja y engorrosa en comparación con la simple
object == null
.Aquí hay un fragmento para comparar el beneficio de
Objects.isNull(object)
List<String> list = Arrays.asList("a", "b", null, "c", null); // As ready-made predicate long countNullsWithPredicate = list.stream().filter(Objects::isNull).count(); // Lambda long countNullsWithLambda = list.stream().filter(object -> object == null).count(); // Reimplement the Objects::isNull predicate long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() { @Override public boolean test(Object obj) { return obj == null; } }).count();
fuente
Semánticamente no hay diferencia, pero para la legibilidad prefiero lo siguiente
whatever == null
:import static java.util.Objects.isNull; // Other stuff... if(isNull(whatever)) { }
fuente