Какое равенство делает Apache, для которого палата общин ObjectUtils равняется тесту метода?

Я всегда понимал там, чтобы быть двумя типами равенства в Java,

  • равенство значения: использование .equals() метод для тестирования тех двух объекты реализует отношение эквивалентности на ссылках ненулевого объекта.
  • ссылочное равенство: использование == оператор для тестирования этого два типов примитивов или ячейки памяти равен.

Следующие страницы описывают эти основные принципы языка более подробно.

То, что ни одна из этих ссылок явно не указывает, - то, что должно произойти если два null ссылки на объект сравнены для равенства значения. Неявное предположение - это a NullPointerException должен быть брошен, но это не то, что сделано ObjectUtils.equals () метод, который можно было бы считать служебным методом лучшей практики.

То, что волнует меня, - то, что Apache, палата общин, кажется, эффективно ввела третью меру равенства в Java черным ходом и что уже запутывающее положение дел, возможно, было сделано значительно более сложным. Я называю это третьей мерой равенства, потому что это пытается протестировать на равенство значения и когда это перестало работать, это отступает к тестированию на ссылочное равенство. Apache тест равенства палаты общин имеет много общих черт с равенством значения и ссылочным равенством, но также отчетливо отличается.

Действительно ли я прав быть заинтересованным и хотеть избегать использования ObjectUtils.equals() где когда-нибудь возможный?

Есть ли аргумент в пользу требования этого ObjectUtils.equals() обеспечивает полезное объединение других двух мер равенства?

Выбранный ответ

Кажется, нет мнения о согласии об этом вопросе, но я решил отметить Bozho как корректного, потому что он лучше всего привлек мое внимание к тому, что я теперь рассматриваю как самую большую проблему с пустым безопасным, равняется проверкам. Мы должны все писать код сбоя быстро, который обращается к первопричине того, почему два несуществующих объекта сравниваются для равенства значения вместо того, чтобы пытаться скрыть проблему.

17
задан Duncan Jones 7 August 2014 в 07:17
поделиться

3 ответа

Вот код 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 () , который отличается от метода , равных в этой утилите в нулевом сравнении.
10
ответ дан 30 November 2019 в 14:12
поделиться

Я прав, чтобы быть заинтересованным и хотеть Чтобы избежать использования Objectutils.equals () Где когда-либо возможно?

нет. То, что вам нужно рассмотреть, равняется, зависит от ваших требований. И желая рассмотреть два равных нолка, и любые ненулевые неравные неравные не имеют необходимости иметь дело с NullPointerexceptions, является очень, очень распространенным требованием (например, когда вы хотите пожарить события изменений ценностей из сеттера).

На самом деле, это то, как равно () в целом работает работа, и, как правило, половина того, что refivaiour реализована (API Doc of Object.equals () Состояния «Для любого ненутреннего эталонного значения x , , X.equals (NULL) должны вернуть false.") - что он не работает, наоборот Из-за технических ограничений (язык был разработан без Несколько диспетчеров , чтобы быть проще).

5
ответ дан 30 November 2019 в 14:12
поделиться

Если вы беспокоитесь об этом, вы можете либо 1) не использовать Этот метод 2) Напишите свой собственный, чтобы обернуть его

public class MyObjectUtils {
    public static boolean equals(Object obj1, Object obj2) {
        return obj1 != null && obj2 != null && ObjectUtils.equals(obj1, obj2);
    }
}

мне, кажется, странно, чтобы нулю быть равным нулю, но это не похоже на большую проблему. По большей части я не ожидаю, что мое приложение даже попадет в кодовые пути, которые включают в себя тесты на равенство, если один или несколько объектов нулевые объекты.

1
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: