Compara dos objetos con un cheque para nulo
-
05-07-2019 - |
Pregunta
¿Hay un método en el JDK que compare dos objetos por igualdad, teniendo en cuenta los nulos? Algo como esto:
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 tonto escribir este método yo mismo, ya que creo que tiene que existir en algún lugar.
Solución
Java 7.0 agregó una nueva clase práctica: Objetos
.
Tiene un método exactamente para esto: Objects.equals (Objeto a, Objeto b)
Otros consejos
Apache Commons Lang tiene un método de este tipo: ObjectUtils.equals (object1, object2) . No desea los genéricos en este método, dará lugar a errores de compilación falsos, al menos en el uso general. Equals sabe muy bien (o debería, es parte del contrato) verificar la clase del objeto y devolver falso, por lo que no necesita ningún tipo de seguridad adicional.
FWIW, esta fue mi implementación:
private static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
En mi aplicación, sé que a y b siempre serán del mismo tipo, pero sospecho que esto funciona bien incluso si no lo son, siempre que a.equals () esté razonablemente implementado.
public static boolean equals(Object object1, Object object2) {
if (object1 == null || object2 == null) {
return object1 == object2;
}
return object1.equals(object2);
}
Si está preocupado por NullPointerExceptions, puede probar la igualdad como:
if (obj1 != null && obj1.equals(obj2)) { ... }
El contrato general de equals ()
es que un objeto no nulo nunca debe ser igual a una referencia nula, y que el método equals ()
debe devolver falso si está comparando un objeto con una referencia nula (y no arroja un NPE).
Cada vez que me encuentro con una necesidad y pienso que "esto es tan común, Java debe tenerlo" Pero no lo encuentro, reviso el proyecto de Jakarta Commons. Casi siempre lo tiene. Una búsqueda rápida de la API commons-lang (que tiene la más básica de las utilidades comunes) muestra un equals ()
método que proporciona lo que desea.
Jakarta Commons Lang API tiene lo que está buscando ObjectUtils. es igual a (Objeto, Objeto)