null和equals的对称性

时间:2011-07-14 17:57:04

标签: java null nullpointerexception equals symmetric

平等应该是对称的,对吧?

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

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

让第二种形式抛出NullPointerException的理由是什么?

6 个答案:

答案 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中的定义。