的合同equals http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29关于null
,如下:
对于任何非空参考值x
, x.equals(null)
should return false
.
这是相当奇怪的,因为如果o1 != null
and o2 == null
,那么我们有:
o1.equals(o2) // returns false
o2.equals(o1) // throws NullPointerException
事实是o2.equals(o1) throws NullPointerException
是一件好事,因为它提醒我们程序员的错误。然而,如果由于各种原因我们只是将其切换为o1.equals(o2)
,这只会“默默地失败”。
所以问题是:
- 为什么这是一个好主意
o1.equals(o2)
should return false
而不是扔NullPointerException
?
- 如果我们尽可能重写合同以便
anyObject.equals(null)
总是扔NullPointerException
反而?
与比较Comparable
相比之下,这就是Comparable合同 http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html says:
注意null
不是任何类的实例,并且e.compareTo(null)
应该抛出一个NullPointerException
虽然e.equals(null)
回报false
.
If NullPointerException
适合于compareTo
,为什么不是为了equals
?
相关问题
- 关于空值的可比合同和比较合同 https://stackoverflow.com/questions/2858628/comparable-and-comparator-contract-with-regards-to-null
纯粹语义论证
这些是实际的单词Object.equals(Object obj) http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29文档:
表示是否有一些其他物体“等于”这个。
什么是对象?
JLS 4.3.1 对象 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1
An object is a 类实例或数组。
参考值(通常只是参考)是指向这些对象的指针,以及一个特殊的null
参考,其中没有引用任何对象.
从这个角度来说我的论证其实很简单。
-
equals
测试是否有一些其他物体是“等于”this
-
null
参考文献没有给出其他物体为了测试
- 所以,
equals(null)
应该扔NullPointerException
至于这种不对称性是否不一致的问题,我认为不是,我建议你参考一下这句古老的禅宗公案:
- 问任何一个人是否和下一个人一样优秀,每个人都会说是。
- 问任何一个人是否比任何人都优秀,每个人都会说“不”。
- 如果问任何人是否和任何人一样好,你永远不会得到答复。
在那一刻,编译器顿悟了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)