Comparar dois objetos com um cheque de nulo
-
05-07-2019 - |
Pergunta
Existe um método no JDK que compara dois objetos de igualdade, representando nulos? Algo parecido com isto:
public static boolean equals(Object o1, Object o2)
{
if (o1 == null)
{
return o2 == null; // Two nulls are considered equal
}
else if (o2 == null)
{
return false;
}
return o1.equals(o2);
}
Parece bobagem para escrever este método mim desde que eu acho que tem que existir em algum lugar.
Solução
Java 7.0 adicionou uma nova classe acessível:. Objects
Ele tem um método exatamente para isso: Objects.equals(Object a, Object b)
Outras dicas
Apache Commons Lang tem tal método um: ObjectUtils.equals (object1, object2) . Você não quer que os genéricos sobre tal método um, ele vai levar a erros de compilação falsos, pelo menos em uso geral. Igual sabe muito bem (ou deveria - é parte do contrato) para verificar a classe do objeto e retorno falso, por isso não precisa de qualquer tipo de segurança adicional
.FWIW, esta foi a minha aplicação:
private static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
Na minha aplicação, eu sei que a e b será sempre o mesmo tipo, mas eu suspeito que isso funciona bem, mesmo se eles não estão, desde que a.Equals () é razoavelmente implementado.
public static boolean equals(Object object1, Object object2) {
if (object1 == null || object2 == null) {
return object1 == object2;
}
return object1.equals(object2);
}
Se você está preocupado com NullPointerExceptions você poderia apenas a igualdade de teste como:
if (obj1 != null && obj1.equals(obj2)) { ... }
O contrato geral de equals()
é que um objeto não nulo nunca deve ser igual a uma referência nula, e que o método equals()
deve retornar falso se você está comparando um objeto para uma referência nula (e não jogar um NPE).
Sempre que me deparo com uma necessidade e pensar "isso é tão comum Java deve tê-lo", mas acham que ele não, eu verifico o projeto Jakarta Commons. É quase sempre tem. Uma rápida pesquisa do API commons-lang (que tem o mais básico de utilitários comuns) mostra uma equals()
método que fornece o que você quer.
Jakarta Commons Lang API tem o que você está procurando ObjectUtils. equals (Object, Object)