Сравните два объекта с проверкой на ноль
-
05-07-2019 - |
Вопрос
Есть ли в 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);
}
Кажется глупым писать этот метод самостоятельно, так как я думаю, что он должен где-то существовать.
Решение
Java 7.0 добавила новый удобный класс: Объекты
. р>
У него есть метод именно для этого: Objects.equals (Объект a, Объект b)
Другие советы
В Apache Commons Lang есть такой метод: ObjectUtils.equals (object1, object2) . Вы не хотите обобщений для такого метода, это приведет к фиктивным ошибкам компиляции, по крайней мере, в общем случае. Equals хорошо знает (или должен - это часть контракта) проверять класс объекта и возвращать false, поэтому ему не нужна дополнительная безопасность типов.
FWIW, это была моя реализация:
private static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
В моем приложении я знаю, что a и b всегда будут одного и того же типа, но я подозреваю, что это работает нормально, даже если это не так, при условии, что a.equals () реализована разумно.
public static boolean equals(Object object1, Object object2) {
if (object1 == null || object2 == null) {
return object1 == object2;
}
return object1.equals(object2);
}
Если вы беспокоитесь об исключениях NullPointerException, вы можете просто проверить равенство, например:
if (obj1 != null && obj1.equals(obj2)) { ... }
Общий контракт для equals ()
заключается в том, что ненулевой объект никогда не должен быть равен пустой ссылке, а метод equals ()
должен возвращать false если вы сравниваете объект с нулевой ссылкой (а не бросаете NPE).
Всякий раз, когда я сталкиваюсь с необходимостью и думаю, что "это так часто встречается в Java," но не нашел, я проверяю проект Jakarta Commons. Это почти всегда есть. Быстрый поиск API commons-lang (который имеет самые основные из распространенных утилит) показывает equals ()
, который предоставляет то, что вы хотите.
Jakarta Commons Lang API имеет то, что вы ищете ObjectUtils. равен (Object, Object) р>