关于java:null和equals的对称性

null and the symmetry of equals

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

1
2
3
4
5
Object someObject = new Object();
Object NULL = null;

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

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


在第一种情况下,equals()方法不会抛出NPE,因此您不能使用该参数。对称性是equals()方法的契约的一部分。


在理论意义上,平等当然是被定义为对称的,但在不存在的对象(即空值所代表的对象)上,它也根本没有被定义。

因此,任何应用于空值的行为都同样有效。它可以使一只活生生的兔子回归,但仍然不违背平等的理论定义。

在这种情况下,代表Java设计器的一个非常合理的实现决策,在空值上调用等值应该抛出一个Null PoExtExchange,这与调用null值上的任何其他方法是一致的。


因为在第二种情况下,您没有访问null对象的方法。平等的概念不是不平衡的,而是你如何去理解它。


第二位不会抛出NPE,因为您没有取消对空指针的引用。该代码返回false,因为您正在将值与非值进行比较。

equals(null)总是返回false,因为没有空值。由于Java中没有概念,对象和基元都不能具有EDCOX1×0的值。null是一个表示空引用的文本,这就是我们比较引用的原因,例如if (obj == null)。参见Java语言规范,3.3.7节。换句话说,您将EDOCX1的值(7)与空引用进行比较。

您可以创建自己的对象,重写equals,然后返回true,但这与对象中的定义不符。


我愿意去

1
someObject.equals(null);

What is the rational for not having the second form throw a
NullPointerException?

在这种情况下,它不会抛出NullPointerException。

在这里,我们可以肯定,equals()将调用的对象是NOT NULL


第二个例子不是对称的例子,因为它违反了关于对象和equals()方法的简单规则之一:

For any non-null reference value x, x.equals(null) should return
false.