读书人

小弟我们爱分享-Obey the general con

发布时间: 2012-01-19 20:57:58 作者: rapoo

我们爱分享---Obey the general contract when overriding equals
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when overriding equals

今天只讲其中的一个原则及其注意事项:
symmetric: For any reference values x and y, x.equals(y) must return true if and only if y.equals(x) returns true.
可以称之为对称性或者交换性原则,即x.equals(y)返回true是y.equals(x)的充要条件。

理论大家会讲,但是在override的时候,大家很容易出错。

Java code
public class A {  public int x;  public boolean equals(Object obj) {    if (! (obj instanceof A)) {      return false;    }    A that = (A) obj;    return this.x == that.x;  }}


这段代码粗看上去没有任何问题(null instanceof A也是false),但实际上,这段代码在将来的某个时刻很有可能导致symmetric原则被破坏。
Java code
public class B extends A {  public int y;  public boolean equals(Object obj) {    if (! (obj instanceof B)) {      return false;    }    B that = (B) obj;    return super.equals(obj) && this.y == that.y;  }}

此时,无论B中间的equals方法如何调整,都会导致symmetric原则被破坏:
Java code
A a = new A();B b = new B();System.out.println(a.equals(b)); // true,B是A的子类,b当然是instanceof A,而且由于之比较a.x和b.x,所以trueSystem.out.println(b.equals(a)); // false,a不是B的实例


老实说,这个世界上没有一个完美的修正方案,这点不光是Java,C#等OO语言都有这个问题。

1 如果所有的类都可以修改的话,那么你可以在每一个类中都override equals方法,并用this.getClass() == obj.getClass()来判断(只适用于所有类都是自己写的,最顶层的父类直接继承自Object,而且,每一层都添加了字段)
2 如果能够用组合的话,尽量使用组合,而不是继承“Favor composition over inheritance”,通过这种方式绕过去
3 忍受它,因为这个问题,其实你天天可能在JDK中间碰到这个问题,比如java.util.Date及其java.sql包中间的子类,所以当你如果可能碰到java.util.Date实例和java.sql.Timestamp实例做equals的时候,你就该当心了。

[解决办法]
java.util.Date的equals用的是instanceof判断并不代表我们就一定也非得用instanceof。
[解决办法]

[解决办法]
老师说 好像可以用反射的机制解决这个问题
[解决办法]
不错。是容易犯这个错。
[解决办法]
支持分享,话说effective java的规则真的很不错
[解决办法]
学习学习

lz厉害
[解决办法]

[解决办法]
大胡子干嘛去了
[解决办法]
好贴 好贴!学习了!
[解决办法]
探讨
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when overriding equals

今天只讲其中的一个原则及其注意事项:
symmetric: For any reference values x and y, x.equals(y) must return true if and on……

[解决办法]
http://topic.csdn.net/u/20110813/15/f6b615be-e2b6-4600-aa5d-a9723f309c4f.html
[解决办法]
乐高坦克的贴贴一定要顶~!~!
[解决办法]
来学习的,谢谢分享
[解决办法]
哇,学习中


[解决办法]
来学习的,多谢分享。
[解决办法]
2L是怎么做到的啊
[解决办法]



[解决办法]
谢谢lz
[解决办法]

[解决办法]
好久没研究java了啊
[解决办法]
学习ing
[解决办法]

[解决办法]

HTML code
<td class="rw"><div class="fbart"><dfn>#27楼 得分:0</dfn>回复于:2011-09-15 12:03:21</div><a name="r_75525461"></a><table cellspacing="0" cellpadding="0" class="mtxt"><tbody><tr><td id="rbody_75525461" csdnid="rbody_75525461"><div class="msgfont"><strong>   </strong></div><!--End_rbody_75525461//--></td></tr><tr><td csdnid="rmodify_75525461"></td></tr></tbody></table></td>
[解决办法]
加上#rbody_75525461就能跳到相应的回复嘿嘿
[解决办法]
好东西谢谢分享....

[解决办法]
不错,有深度才好拿出来分享下。
[解决办法]
我是来学习的。
[解决办法]
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when ove
[解决办法]
谢谢分享 以后多分享点这样的好东西哦
[解决办法]
顶lz
[解决办法]
探讨

补充一下,如果用this.getClass() == obj.getClass(),需要判断obj是否null

[解决办法]
<label></label>
[解决办法]
</div><div>
[解决办法]
学习学习了! 嘿嘿。。 最近好东西不少啊。!

[解决办法]
内容讲解独到,从中学到了知识点,谢谢!
[解决办法]
探讨
引用:

http://topic.csdn.net/u/20110813/15/f6b615be-e2b6-4600-aa5d-a9723f309c4f.html

很不幸,你确实是错的。

很明显int的范围,显然不可能描绘整个大千世界。比如,Long的有2^64种组合,而int类型的hashCode只有2^32种组合,也就是说,每种hashCod……

[解决办法]
所以俺说同一类型的不重复不就行了么 再说出现重复的几率是多大 难道说我现在用HASHMAP之前我得正襟危坐一段时间 思考:用起来会有危险 到底用不用呢

[解决办法]
记得java核心中也讲过这个问题,那里面介绍了一种比较好的办法,具体方法忘了,大家可以看看


[解决办法]
en 收藏了
[解决办法]
感谢分享!
[解决办法]
学习,感谢楼主!!!!
[解决办法]

探讨
再看看hashmap代码咯,没凶险的。
最后还是看key的equals,hashCode只是决定entry位置,但如果发生冲撞(hashCode相同,但不equals),就会被放到当前位置table[indexFor(hash(key.hashCode()), table.length)]的entry.next,get的时候也是按照hashCode算table中的位置,但是还是要一个个遍历ent……

[解决办法]
探讨

所以我说hashCode的比较结果和equals的比较结果必须一样 那个帖子说可以不一样 我就很诧异

[解决办法]
探讨
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when overriding equals

今天只讲其中的一个原则及其注意事项:
symmetric: For any reference values x and y, x.equals(y) must return true if and on……

[解决办法]
探讨
引用:

所以我说hashCode的比较结果和equals的比较结果必须一样 那个帖子说可以不一样 我就很诧异

忍不住想说两句:

hash一样的,可以不equals
equals的,hash必然一样

通常可以把hashCode看做是一种初排。初排一致的,equals必须能细分是否真的equal。初排就不一致的,equals居然返回true的……

[解决办法]
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?
探讨
引用:
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when overriding equals

今天只讲其中的一个原则及其注意事项:
symmetric: For any reference values x and y, x.equals(y) must r……

[解决办法]
探讨

不过还是很不爽 那个帖子的意思不是您说的这个意思

[解决办法]
探讨
引用:

不过还是很不爽 那个帖子的意思不是您说的这个意思

不是所有人都可以说服的,你想开点。自己明白就好了。呵呵。

[解决办法]
探讨
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?

引用:
引用:
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when overriding equals

今天只讲其中的一……

[解决办法]
强调类型相同更应该是用getClass而不是instanceof。
探讨
引用:
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?

引用:
引用:
这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则
Obey the general contract when ov……

[解决办法]
<STRONG> </STRONG>
[解决办法]
探讨
强调类型相同更应该是用getClass而不是instanceof。

引用:
引用:
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?

引用:
引用:
这两天热度有点低,也没什么好写的,就随……

[解决办法]
绝对没有找茬的意思。误会,误会了,九哥。
只是讨论帖子而已。
探讨
引用:
强调类型相同更应该是用getClass而不是instanceof。

引用:
引用:
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?

引用:
引用楼主 shine33……



[解决办法]
求楼主赏分啊,我发帖木有分数啦,跪求啊
[解决办法]
天天向上!
[解决办法]
看看,学习了。。。。
[解决办法]

[解决办法]
学习!!容易搞错!!谢谢楼主!
[解决办法]
学习!!容易搞错!!谢谢楼主!
[解决办法]
学习下

读书人网 >J2EE开发

热点推荐