Я всегда понимал там, чтобы быть двумя типами равенства в Java,
.equals()
метод для тестирования тех двух объекты реализует отношение эквивалентности на ссылках ненулевого объекта.==
оператор для тестирования этого два типов примитивов или ячейки памяти равен.Следующие страницы описывают эти основные принципы языка более подробно.
То, что ни одна из этих ссылок явно не указывает, - то, что должно произойти если два null
ссылки на объект сравнены для равенства значения. Неявное предположение - это a NullPointerException
должен быть брошен, но это не то, что сделано ObjectUtils.equals () метод, который можно было бы считать служебным методом лучшей практики.
То, что волнует меня, - то, что Apache, палата общин, кажется, эффективно ввела третью меру равенства в Java черным ходом и что уже запутывающее положение дел, возможно, было сделано значительно более сложным. Я называю это третьей мерой равенства, потому что это пытается протестировать на равенство значения и когда это перестало работать, это отступает к тестированию на ссылочное равенство. Apache тест равенства палаты общин имеет много общих черт с равенством значения и ссылочным равенством, но также отчетливо отличается.
Действительно ли я прав быть заинтересованным и хотеть избегать использования ObjectUtils.equals()
где когда-нибудь возможный?
Есть ли аргумент в пользу требования этого ObjectUtils.equals()
обеспечивает полезное объединение других двух мер равенства?
Кажется, нет мнения о согласии об этом вопросе, но я решил отметить Bozho как корректного, потому что он лучше всего привлек мое внимание к тому, что я теперь рассматриваю как самую большую проблему с пустым безопасным, равняется проверкам. Мы должны все писать код сбоя быстро, который обращается к первопричине того, почему два несуществующих объекта сравниваются для равенства значения вместо того, чтобы пытаться скрыть проблему.
Вот код objectutils.equals (..)
:
public static boolean equals(Object object1, Object object2) {
if (object1 == object2) {
return true;
}
if ((object1 == null) || (object2 == null)) {
return false;
}
return object1.equals(object2);
}
objecutils docs Очевидно, что объекты пройдены могут Отказ
Теперь по этому вопросу, правда ли
, если вы сравниваете два NULL
. На мой взгляд - нет, потому что:
NullPointerexception
NULL
, чтобы сравнить означает, что они получили от где-то вместо «реальных» объектов, возможно, из-за некоторой проблемы. В этом случае сравниваем их самостоятельно неправильно - поток программы должен был остановить до этого. CAVELORBOTHNULL ()
, который отличается от метода , равных
в этой утилите в нулевом сравнении. Я прав, чтобы быть заинтересованным и хотеть Чтобы избежать использования Objectutils.equals () Где когда-либо возможно?
нет. То, что вам нужно рассмотреть, равняется, зависит от ваших требований. И желая рассмотреть два равных нолка, и любые ненулевые неравные неравные не имеют необходимости иметь дело с NullPointerexceptions, является очень, очень распространенным требованием (например, когда вы хотите пожарить события изменений ценностей из сеттера).
На самом деле, это то, как равно ()
в целом работает работа, и, как правило, половина того, что refivaiour реализована (API Doc of Object.equals ()
Состояния «Для любого ненутреннего эталонного значения x
, ,
X.equals (NULL)
должны вернуть false.") - что он не работает, наоборот Из-за технических ограничений (язык был разработан без Несколько диспетчеров , чтобы быть проще).
Если вы беспокоитесь об этом, вы можете либо 1) не использовать Этот метод 2) Напишите свой собственный, чтобы обернуть его
public class MyObjectUtils {
public static boolean equals(Object obj1, Object obj2) {
return obj1 != null && obj2 != null && ObjectUtils.equals(obj1, obj2);
}
}
мне, кажется, странно, чтобы нулю быть равным нулю, но это не похоже на большую проблему. По большей части я не ожидаю, что мое приложение даже попадет в кодовые пути, которые включают в себя тесты на равенство, если один или несколько объектов нулевые объекты.