我们爱分享---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厉害
[解决办法]
[解决办法]
大胡子干嘛去了
[解决办法]
好贴 好贴!学习了!
[解决办法]
[解决办法]
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
[解决办法]
[解决办法]
<label></label>
[解决办法]
</div><div>
[解决办法]
学习学习了! 嘿嘿。。 最近好东西不少啊。!
[解决办法]
内容讲解独到,从中学到了知识点,谢谢!
[解决办法]
[解决办法]
所以俺说同一类型的不重复不就行了么 再说出现重复的几率是多大 难道说我现在用HASHMAP之前我得正襟危坐一段时间 思考:用起来会有危险 到底用不用呢
[解决办法]
记得java核心中也讲过这个问题,那里面介绍了一种比较好的办法,具体方法忘了,大家可以看看
[解决办法]
en 收藏了
[解决办法]
感谢分享!
[解决办法]
学习,感谢楼主!!!!
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
我就不信用这个方式override equals方法还会出错。
为什么要用instanceof呢?
[解决办法]
[解决办法]
[解决办法]
[解决办法]
强调类型相同更应该是用getClass而不是instanceof。
[解决办法]
<STRONG> </STRONG>
[解决办法]
[解决办法]
绝对没有找茬的意思。误会,误会了,九哥。
只是讨论帖子而已。
[解决办法]
求楼主赏分啊,我发帖木有分数啦,跪求啊
[解决办法]
天天向上!
[解决办法]
看看,学习了。。。。
[解决办法]
[解决办法]
学习!!容易搞错!!谢谢楼主!
[解决办法]
学习!!容易搞错!!谢谢楼主!
[解决办法]
学习下