Нуль и симметрия равных
Равенство должно быть симметричным, верно?
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.