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