合同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
测试其他对象是否“等于”this
null
参考没有给出其他测试对象- 因此,
equals(null)
应该扔NullPointerException