平等应该是对称的,对吧?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
不让第二种形式抛出NullPointerException
的理由是什么?
答案 0 :(得分:4)
在第一种情况下,equals()方法不会抛出NPE,因此您无法生成该参数。对称性是equals()方法的契约的一部分。
答案 1 :(得分:2)
在理论意义上,等式肯定被定义为对称,但根本没有在不存在的对象上定义(这是null代表的)。
因此,应用于null时的任何行为都同样有效。它可以归还一只活的兔子,但仍然不会与平等的理论定义相矛盾。
在这种情况下,代表Java设计者的一个非常合理的实现决策是调用null值的equals应抛出NullPointerException,因为这与调用null值上的任何其他方法一致。
答案 2 :(得分:1)
因为在第二种情况下您没有访问null
对象的方法。并不是平等的概念是不平衡的,而是你如何访问它。
答案 3 :(得分:0)
第二个例子不是对称的例子,因为它违反了关于Object和equals() method的一个简单规则:
对于任何非空引用值x,应返回x.equals(null) 假的。
答案 4 :(得分:0)
我会去
someObject.equals(null);
没有第二种形式的理由是什么? 的NullPointerException?
在这种情况下,它不会抛出NullPointerException。
我们确信equals()
要调用的对象是NOT NULL
。
答案 5 :(得分:0)
第二个位不会抛出NPE,因为您没有取消引用空指针。该代码返回false,因为您正在将值与非值进行比较。
equals(null)
将始终返回false,因为没有null值。 Object和primitive都不能具有值null
,因为Java中不存在该概念。 null
是一个表示空引用的文字,这就是我们比较引用的原因,例如if (obj == null)
。请参阅Java语言规范section 3.10.7。换句话说,您正在将someObject
的值与空引用进行比较。
您可以创建自己的对象,覆盖equals
,然后返回true,但这会违反Object中的定义。