Я всегда понимал, что существуют два типа равенства в 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()
обеспечивает полезный союз двух других мер равенства?
Выбранный ответ
По этому вопросу, похоже, нет консенсусного мнения, но я решил отметить Божо как правильно, потому что он лучше всего привлек мое внимание к тому, что я сейчас рассматриваю как самую большую проблему с нулевыми безопасными проверками на равные. Мы все должны писать отказоустойчивый код, который устраняет основную причину того, почему два нулевых объекта сравниваются для равенства значений, а не пытаются охватить проблему под ковром.