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