合同equals与问候null,如下:
对于任何非null的参考值
x,x.equals(null)应使用return false。
这是很特殊的,因为如果o1 != null和o2 == null,那么我们有:
o1.equals(o2) // returns false
o2.equals(o1) // throws NullPointerException
这o2.equals(o1) throws NullPointerException是一件好事,因为它使我们意识到程序员的错误。但是,如果由于各种原因我们只是将其切换到o1.equals(o2),则该错误将不会被捕获,而这只会“静默失败”。
所以问题是:
- 为什么
o1.equals(o2)不应该return false抛出一个好主意NullPointerException呢? - 如果我们尽可能重写合同以改为
anyObject.equals(null)始终抛出,那将是一个坏主意NullPointerException吗?
与比较 Comparable
相比之下,Comparable合同是这样说的:
请注意,
null不是任何类的实例,并e.compareTo(null)应抛出NullPointerException,即使e.equals(null)回报false。
如果NullPointerException适合compareTo,为什么不适合equals呢?
相关问题
一个纯粹的语义论点
这些是Object.equals(Object obj)文档中的实际词语:
指示其他某个对象是否“等于”该对象。
什么是物体?
JLS 4.3.1对象
一个对象是一个类的实例或阵列。
引用值(通常只是引用)是指向这些对象的指针,是一个特殊的
null引用,它不引用任何对象。
从这个角度来说,我的论点非常简单。
equals测试其他对象是否“等于”thisnull参考没有给出其他测试对象- 因此,
equals(null)应该扔NullPointerException