Я всегда понимал, что существуют два типа равенства в Java,
- Значение: использует метод
.equals()для проверки того, что два объекта реализуют отношение эквивалентности для ненулевых ссылок на объекты. - ссылочное равенство: использует оператор
==для проверки того, что два примитивных типа или ячейки памяти равны.
Следующие страницы более подробно описывают эти языковые основы.
- Wikibooks Программирование на Java: Программирование на Java/сравнение объектов
- xyzws Часто задаваемые вопросы по Java EE: Каковы различия между оператором равенства и методом equals?
- API платформы Java: Javadoc для Object.equals()
- Спецификация языка Java: Операторы равенства
То, что явно не указано ни одной из этих ссылок, - это то, что должно произойти, если две ссылки на объекты null сравниваются для равенства значений. Неявное предположение заключается в том, что должен быть выброшен a NullPointerException, но это не то, что делает метод ObjectUtils.equals(), который может считаться полезным методом утилиты.
Меня беспокоит, что Apache Commons, похоже, эффективно внедрил третью меру равенства в Java за дверью и что уже путаное положение дел могло быть значительно сложнее. Я называю это третьей мерой равенства, потому что он пытается проверить равенство значений, а когда это не удается, он возвращается к тестированию для ссылочного равенства. Тест равенства Apache Commons имеет много общего с равенством равенства и ссылочным равенством, но также совершенно другим.
Я прав, чтобы вас беспокоило, и я хочу, чтобы избежать использования ObjectUtils.equals(), где это возможно?
Есть ли аргумент для утверждения, что ObjectUtils.equals() обеспечивает полезный союз двух других мер равенства?
Выбранный ответ
По этому вопросу, похоже, нет консенсусного мнения, но я решил отметить Божо как правильно, потому что он лучше всего привлек мое внимание к тому, что я сейчас рассматриваю как самую большую проблему с нулевыми безопасными проверками на равные. Мы все должны писать отказоустойчивый код, который устраняет основную причину того, почему два нулевых объекта сравниваются для равенства значений, а не пытаются охватить проблему под ковром.