Como você sabe, java.util.Objects
é
Esta classe consiste em métodos utilitários estáticos para operar em objetos.
Um desses métodos é Objects.isNull()
.
Meu entendimento é que Objects.isNull()
removeria a chance de atribuir acidentalmente um valor nulo ao objeto, omitindo o segundo =
.
No entanto, a nota da API afirma:
Este método existe para ser usado como um Predicado, filtro (Objetos :: isNull)
Haveria algum motivo / circunstância pelo qual eu deveria usar object == null
over Objects.isNull()
em uma declaração if ?
Deve Objects.isNull()
ser confinado exclusivamente a Predicados?
if(null == variable)
consistente ...variable
for aBoolean
.Respostas:
Se você olhar o código-fonte do
IsNull
método,/* Returns true if the provided reference is null otherwise returns false.*/ public static boolean isNull(Object obj) { return obj == null; }
É o mesmo. Não há diferença. Portanto, você pode usá-lo com segurança.
fonte
== null
emif
, mas isNull é ótimo para usar em expressões lambda.Objects.isNull
destina-se ao uso na filtragem lambda do Java 8.É muito mais fácil e claro escrever:
do que escrever:
.stream().filter(x -> x == null).
Em uma
if
declaração, entretanto, qualquer um dos dois funcionará. O uso de== null
é provavelmente mais fácil de ler, mas no final se resumirá a uma preferência de estilo.fonte
Veja a fonte:
public static boolean isNull(Object obj) { return obj == null; }
Para verificar os
null
valores, você pode usar:Objects.isNull(myObject)
null == myObject // avoids assigning by typo
myObject == null // risk of typo
O fato de
Objects.isNull
ser destinado aPredicate
s não o impede de usá-lo como acima.fonte
=
vez de==
(não compilaria a menos que fosse umBoolean
wrapper anulável , seja justo)Boolean
wrappers anuláveis em Java. Isso é muito raro (e dará avisos ao compilador quando uma atribuição denull
for verificada como se fosse uma condição), mas não impossível.Sim, um dos motivos é manter o código simples. Dentro de if, a declaração
object == null
é clara e bem conhecida. Isso não pode levar a qualquer mau comportamento se, por exemplo, houver um erro de digitação.Se houver um
if (object = null) {}
com omitido=
não irá compilar ou irá gerar um aviso no caso doBoolean
objeto! Na verdade não há razão para usarObjects.isNull(object)
ao longoobject == null
dentro de if . Aqui estão as duas variantes lado a lado:if (object == null) { } if (Objects.isNull(object)) { }
Pode-se dizer que sim, está confinado exclusivamente a Predicados, embora não haja nenhum obstáculo técnico para usá-lo em
Objects.isNull()
todos os lugares.Do
public static boolean isNull(Object obj)
javadoc do método:Portanto, se você usar o método como não um predicado, estará, na verdade, usando uma expressão mais complexa e incômoda do que a simples
object == null
.Aqui está um snippet para comparar o benefício 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();
fonte
Semanticamente, não há diferença, mas para facilitar a leitura, prefiro o seguinte
whatever == null
:import static java.util.Objects.isNull; // Other stuff... if(isNull(whatever)) { }
fonte