Нуль и симметрия равных

Равенство должно быть симметричным, верно?

Object someObject = new Object();
Object NULL = null;

NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false

В чем причина отсутствия второй формы NullPointerException?

6 ответов

Решение

Равенство определенно определено как симметричное в теоретическом смысле, но оно также вообще не определено для несуществующих объектов (что представляет собой нулевое значение).

Следовательно, любое поведение применительно к нулю будет одинаково допустимым. Он может вернуть живого кролика и все же не противоречить теоретическому определению равенства.

В таком случае вполне разумно принять решение от имени разработчиков Java, что при вызове equals для нулевого значения должно генерироваться исключение NullPointerException, поскольку это согласуется с вызовом любого другого метода для нулевого значения.

В первом случае метод equals() не выбрасывает NPE, поэтому вы не можете использовать этот аргумент. Симметрия является частью контракта метода equals().

Потому что у вас нет доступа к методу null объект во втором случае. Несбалансированна не концепция равенства, а то, как вы к ней обращаетесь.

Второй пример не является примером симметрии, потому что он нарушает одно из простых правил в отношении Object и метода equals():

Для любого ненулевого ссылочного значения x, x.equals(null) должен возвращать false.

Я бы пошел на

someObject.equals(null);

Что является рациональным, если вторая форма не генерирует исключение NullPointerException?

В этом случае он не выдаст исключение NullPointerException.

Здесь мы уверены, что объект, на котором equals() собирается вызвать NOT NULL,

Второй бит не бросает NPE, потому что вы не разыменовываете нулевой указатель. Этот код возвращает false, потому что вы сравниваете значение с не-значением.

equals(null) всегда будет возвращать false, потому что нет такого понятия, как нулевое значение. Ни Object, ни примитив не могут иметь значение null так как концепция не существует в Java. null является литералом, который представляет пустую ссылку, поэтому мы сравниваем ссылки, такие как if (obj == null), См. Спецификацию языка Java, раздел 3.10.7. Другими словами, вы сравниваете ценность someObject на нулевую ссылку.

Вы можете сделать свой собственный объект, переопределить equalsи верните true, но это противоречит определению в Object.

Другие вопросы по тегам