Сравните два объекта с проверкой на ноль - PullRequest
41 голосов
/ 10 сентября 2009

Есть ли в JDK метод, который сравнивает два объекта на равенство с учетом нулей? Примерно так:

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

Кажется глупым писать этот метод самому, поскольку я думаю, что он должен где-то существовать.

Ответы [ 7 ]

68 голосов
/ 03 сентября 2014

Java 7.0 добавила новый удобный класс: Objects.

У него есть метод именно для этого: Objects.equals(Object a, Object b)

17 голосов
/ 10 сентября 2009

В Apache Commons Lang есть такой метод: ObjectUtils.equals (object1, object2) . Вы не хотите обобщений для такого метода, это приведет к фиктивным ошибкам компиляции, по крайней мере, в общем случае. Equals очень хорошо знает (или должен - это часть контракта) проверять класс объекта и возвращать false, поэтому ему не требуется никакой дополнительной безопасности типа.

15 голосов
/ 16 февраля 2012

FWIW, это была моя реализация:

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

В моем приложении я знаю, что a и b всегда будут одного и того же типа, но я подозреваю, что это прекрасно работает, даже если это не так, при условии, что a.equals () разумно реализована.

5 голосов
/ 20 декабря 2012
public static boolean equals(Object object1, Object object2) {
    if (object1 == null || object2 == null) {
        return object1 == object2;
    }
    return object1.equals(object2);
}
4 голосов
/ 10 сентября 2009

Если вы беспокоитесь об исключениях NullPointerException, вы можете просто проверить равенство, например:

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

Общий контракт equals() заключается в том, что ненулевой объект никогда не должен быть равен нулевой ссылке, а метод equals() должен возвращать false, если вы сравниваете объект с нулевой ссылкой (а не бросаете NPE).

2 голосов
/ 10 сентября 2009

Всякий раз, когда я сталкиваюсь с необходимостью и думаю, что «это так часто встречается в Java, она должна быть», но обнаруживаю, что это не так, я проверяю проект Jakarta Commons. Это почти всегда есть. Быстрый поиск API commons-lang (который имеет самые основные из распространенных утилит) показывает метод equals(), который обеспечивает то, что вы хотите.

1 голос
/ 10 сентября 2009

Jakarta Commons Lang API имеет то, что вы ищете ObjectUtils.equals (Object, Object)

...