Confronta due oggetti con un controllo per null
-
05-07-2019 - |
Domanda
Esiste un metodo nel JDK che confronta due oggetti per l'uguaglianza, tenendo conto dei null? Qualcosa del genere:
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);
}
Sembra sciocco scrivere questo metodo da solo poiché penserei che debba esistere già da qualche parte.
Soluzione
Java 7.0 ha aggiunto una nuova classe utile: Oggetti
.
Ha un metodo esattamente per questo: Objects.equals (Oggetto a, Oggetto b)
Altri suggerimenti
Apache Commons Lang ha un tale metodo: ObjectUtils.equals (oggetto1, oggetto2) . Non vuoi generici su un tale metodo, porterà a falsi errori di compilazione, almeno in uso generale. Equals sa molto bene (o dovrebbe - fa parte del contratto) controllare la classe dell'oggetto e restituire false, quindi non ha bisogno di alcuna sicurezza aggiuntiva di tipo.
FWIW, questa era la mia implementazione:
private static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
Nella mia applicazione, so che aeb sarà sempre dello stesso tipo, ma sospetto che funzioni bene anche se non lo sono, a condizione che a.equals () sia ragionevolmente implementato.
public static boolean equals(Object object1, Object object2) {
if (object1 == null || object2 == null) {
return object1 == object2;
}
return object1.equals(object2);
}
Se sei preoccupato per NullPointerExceptions puoi semplicemente testare l'uguaglianza come:
if (obj1 != null && obj1.equals(obj2)) { ... }
Il contratto generale di equals ()
è che un oggetto non null non dovrebbe mai essere uguale a un riferimento null e che il metodo equals ()
dovrebbe restituire false se si sta confrontando un oggetto con un riferimento null (e non si lancia un NPE).
Ogni volta che incontro un'esigenza e penso "questo è così comune che Java deve averlo" ma non lo trovo, controllo il progetto Jakarta Commons. Quasi sempre ce l'ha. Una rapida ricerca dell'API commons-lang (che ha le utilità di base più comuni) mostra un equals ()
che fornisce ciò che desideri.
Jakarta Commons Lang L'API ha ciò che stai cercando ObjectUtils. Equals (Object, Object)