web-dev-qa-db-fra.com

Comparer deux objets avec une vérification de null

Existe-t-il une méthode dans le JDK qui compare deux objets pour l'égalité, en tenant compte des valeurs nulles? Quelque chose comme ça:

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);
}

Il semble idiot d'écrire cette méthode moi-même car je pense qu'elle doit déjà exister quelque part.

43
dcstraw

Java 7.0 a ajouté une nouvelle classe pratique: Objects .

Il a une méthode exactement pour cela: Objects.equals(Object a, Object b)

72
icza

Apache Commons Lang a une telle méthode: ObjectUtils.equals (object1, object2) . Vous ne voulez pas de génériques sur une telle méthode, cela entraînera de fausses erreurs de compilation, du moins en général. Equals sait très bien (ou devrait - cela fait partie du contrat) pour vérifier la classe de l'objet et retourner false, il n'a donc pas besoin de sécurité de type supplémentaire.

17
Yishai

FWIW, c'était ma mise en œuvre:

private static boolean equals(Object a, Object b) {
    return a == b || (a != null && a.equals(b));
}

Dans mon application, je sais que a et b seront toujours du même type, mais je soupçonne que cela fonctionne bien même s'ils ne le sont pas, à condition que a.equals () soit raisonnablement implémenté.

16
Edward Falk
public static boolean equals(Object object1, Object object2) {
    if (object1 == null || object2 == null) {
        return object1 == object2;
    }
    return object1.equals(object2);
}
5
farid_z

Si vous vous inquiétez des NullPointerExceptions, vous pouvez simplement tester l'égalité comme:

if (obj1 != null && obj1.equals(obj2)) { ... }

Le contrat général de equals() est qu'un objet non nul ne doit jamais être égal à une référence null, et que la méthode equals() doit retourner false si vous comparez un objet à un null référence (et non pas lancer un NPE).

4
matt b

Chaque fois que je rencontre un besoin et je pense que "c'est si courant Java doit l'avoir" mais que je ne le trouve pas, je vérifie le projet Jakarta Commons. Il l'a presque toujours. Une recherche rapide de l'API commons-lang (qui possède les utilitaires les plus élémentaires) affiche une méthode equals() qui fournit ce que vous voulez.

2
SingleShot
1
cjstehno