Если вы принимаете во внимание объектно-ориентированные концепции и рассматриваете целые роли отправителя и получателя, я бы сказал, что такое поведение удобно. Посмотрите в первом случае, вы спрашиваете объект, равен ли он никому. Он ДОЛЖЕН сказать "НЕТ, я не".
Во втором случае вы ни к кому не обращаетесь, поэтому вы никого не спрашиваете. ЭТО должно вызвать исключение, первый случай не должен.
Я думаю, что это только асимметрично, если вы как бы забыли об ориентации объекта и рассматриваете выражение как математическое равенство. Однако в этой парадигме оба конца играют разные роли, поэтому следует ожидать, что порядок имеет значение.
В качестве последнего пункта. При возникновении ошибки в вашем коде должно возникать исключение нулевого указателя. Тем не менее, спрашивать объект, если он никто, не следует считать недостатком программирования. Я думаю, что вполне нормально спросить объект, если он не нулевой. Что если вы не контролируете источник, предоставляющий вам объект? и этот источник отправляет вам ноль. Вы бы проверили, является ли объект нулевым, и только потом посмотрите, равны ли они? Разве не было бы более интуитивно просто сравнивать два, и независимо от того, что является вторым объектом, сравнение будет выполняться без исключений?
Честно говоря, я бы разозлился, если метод equals внутри своего тела нарочно возвращает исключение нулевого указателя. Равные предназначены для использования против любого типа объекта, поэтому он не должен быть настолько разборчив в том, что он получает. Если метод equals вернул npe, последнее, о чем я думаю, это то, что он сделал это специально. Особенно учитывая, что это непроверенное исключение. Если бы вы подняли npe, то парню пришлось бы помнить, что нужно всегда проверять наличие нуля, прежде чем вызывать ваш метод, или, что еще хуже, окружать вызов равными в блоке try / catch (Боже, я ненавижу блоки try / catch). ..