Effective java -- 2 对于所有对象都通用到方法
第八條:覆蓋equals時請遵守通用約定
什么時候需要覆蓋equals方法?類具有自己的邏輯相等概念,并且父類的equals方法不能滿足需要。
重寫equals時需要遵循一下約定:
- 自反性:非null x,x.equals(x)必須是true
- 對稱性:非null x和y,y.equals(x)和x.equals(y)的結果必須一致
- 傳遞性:非null x、y、z,如果x.equals(y)和x.equals(z)的結果為true,那么y.equals(z)也必須為true
- 一致性:非null x、y,只要equals的比較操作在對象中所用的信息沒有被修改,多次調用x.equals(y)的結果就一致。
- 對于非null x,x.equals(null)一定是false
自反性:不知道怎么寫能讓這個返回false,如果返回false了,那么把結果添加到Collection集合類中時,那么contains方法就會一直返回false
對稱性:
這兩個比較就違反了自反性,fifth1.equals(s)調用自定義的equals方法,s.equals(fifth1)調用String的equals方法。
List<Fifth1> list = new ArrayList<Fifth1>();list.add(fifth1);list.contains(s);然后又有這種代碼,結果可能是true,也可能拋運行時異常。
傳遞性:
ColorPoint肯定需要一個equals。
@Overridepublic boolean equals(Object obj) {if (obj instanceof ColorPoint) {return false;}return super.equals(obj) && ((ColorPoint)obj).color.equals(color);} Point p = new Point(1, 1);ColorPoint colorPoint = new ColorPoint(1, 1, "red");這兩個比較會失去對稱性。
這么寫equals:
Point p = new Point(1, 1);
ColorPoint colorPoint1 = new ColorPoint(1, 1, "red");
ColorPoint colorPoint2 = new ColorPoint(1, 1, "blue");
colorPoint1.equals(p);
colorPoint2.equals(p);
colorPoint1.equals(colorPoint2);
比較這三個的時候又會失去傳遞性。
其實上面的那種設計,沒有什么特別好的辦法。改變設計框架還能解決上面的問題,第一中辦法是將Color作為ColorPoint的成員。另一種辦法是將超類建成抽象類,只要不能直接實例花超類的實例,上面的問題就不會發生。
一致性:相等的永遠相等,除非改變了什么。在比較的時候,不要使equals依賴不可靠的資源。
非空性:書的作者起的名,指所有的對象和null 比較的時候都不能返回true。還有在方法里不能返回NullpointerException。
在寫完一個equals方法時一定要考慮是否是對稱的,傳遞的,一致的。自反和非空通常會自動滿足。
忠告:
- 覆蓋equals時也要覆蓋hashCode()方法。
- 不要企圖讓equals過于智能,會出現很多麻煩的東西
- 不要將生命的Object替換成其他的東西。如果是其他的就是重載而不是覆蓋。
第九條:覆蓋equals時總要覆蓋hashCode方法
如果覆蓋了equals而沒有覆蓋hashCode,會違反Object.hashCode的通用約定,導致該類無法結合所有基于散列的集合一起正常運作,這樣的集合包括HashMap,HashSet,HashTable。
Object規范:
- 在應用的執行期間,只要對象的equals方法的比較所用到的信息沒有被修改,那么對這個同一對象調用多次,hashCode方法都返回同一個正數。在同一個應用程序的多次執行過程中,每次執行所返回的正數可以不一致
- 如果兩個對象根據equals比較相等,那么hashCode放回的整數一定相等
- 如果兩個對象根據equals比較不相等,那么hashCode放回的整數有可能相等。但是應該知道,不同對象返回hashCode不相等會提高散列表的性能。
第十條:始終要覆蓋toString方法
第十一條:謹慎地覆蓋clone
地十二條:考慮實現Comparable
書中太啰嗦,感覺沒什么好說的。
轉載于:https://www.cnblogs.com/badboyf/p/6283598.html
總結
以上是生活随笔為你收集整理的Effective java -- 2 对于所有对象都通用到方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ 1528】 1528: [P
- 下一篇: Maven之(二)Maven生命周期