与null
相关的equals
合同如下:
对于任何非空的引用值
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)
,那么这个错误就不会被捕捉到,相反,它只会“静默地失败”。
所以问题是:
NullPointerException
return false
是个好主意?如果我们尽可能地重写契约,让anyObject.equals(null)
总是抛出NullPointerException
,那就不是个好主意了?与Comparable
的比较
相比之下,Comparable
contract是这样说的:
请注意,
null
不是任何类的实例,e.compareTo(null)
应该抛出NullPointerException
,即使e.equals(null)
返回false
。
如果NullPointerException
适用于compareTo
,为什么不适用于equals
相关问题
纯粹的语义论证
以下是Object.equals(Object obj)
文档中的实际单词:
表示其他某个对象是否“等于”这个对象。
什么是对象?
JLS 4.3.1 Objects
对象是一个类实例或数组。
引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的null
引用,它不引用任何对象。
从这个角度来看,我的论点非常简单。
equals
测试某个其他对象是否“等于”this
null
引用没有给出其他对象,因为testequals(null)
应该抛出NullPointerException
https://stackoverflow.com/questions/2887761
复制相似问题