日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Effective java -- 2 对于所有对象都通用到方法

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective java -- 2 对于所有对象都通用到方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第八條:覆蓋equals時請遵守通用約定

什么時候需要覆蓋equals方法?類具有自己的邏輯相等概念,并且父類的equals方法不能滿足需要。
重寫equals時需要遵循一下約定:

  • 自反性:非null x,x.equals(x)必須是true
  • 對稱性:非null x和y,y.equals(x)和x.equals(y)的結(jié)果必須一致
  • 傳遞性:非null x、y、z,如果x.equals(y)和x.equals(z)的結(jié)果為true,那么y.equals(z)也必須為true
  • 一致性:非null x、y,只要equals的比較操作在對象中所用的信息沒有被修改,多次調(diào)用x.equals(y)的結(jié)果就一致。
  • 對于非null x,x.equals(null)一定是false

自反性:不知道怎么寫能讓這個返回false,如果返回false了,那么把結(jié)果添加到Collection集合類中時,那么contains方法就會一直返回false
對稱性:

class Fifth1 {private String s;public Fifth1(String s) {this.s = s;}@Overridepublic boolean equals(Object o) {if (o instanceof Fifth1) {return s.equalsIgnoreCase(((Fifth1) o).s);}if (o instanceof String) {return s.equalsIgnoreCase((String) o);}return false;} } Fifth1 fifth1 = new Fifth1("FZK");String s = "fzk";

這兩個比較就違反了自反性,fifth1.equals(s)調(diào)用自定義的equals方法,s.equals(fifth1)調(diào)用String的equals方法。

List<Fifth1> list = new ArrayList<Fifth1>();list.add(fifth1);list.contains(s);

然后又有這種代碼,結(jié)果可能是true,也可能拋運(yùn)行時異常。
傳遞性:

class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object obj) {if (!(obj instanceof Point))return false;Point p = (Point) obj;return p.x == x && p.y == y;} }class ColorPoint extends Point {private final String color;public ColorPoint(int x, int y, String color) {super(x, y);this.color = color;}}

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:

@Overridepublic boolean equals(Object obj) {if (obj instanceof ColorPoint) {return false;}if (!(obj instanceof ColorPoint)) {return obj.equals(this);}// obj is a ColorPointreturn super.equals(obj) && ((ColorPoint)obj).color.equals(color);}

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);

比較這三個的時候又會失去傳遞性。
其實(shí)上面的那種設(shè)計,沒有什么特別好的辦法。改變設(shè)計框架還能解決上面的問題,第一中辦法是將Color作為ColorPoint的成員。另一種辦法是將超類建成抽象類,只要不能直接實(shí)例花超類的實(shí)例,上面的問題就不會發(fā)生。

一致性:相等的永遠(yuǎn)相等,除非改變了什么。在比較的時候,不要使equals依賴不可靠的資源。

非空性:書的作者起的名,指所有的對象和null 比較的時候都不能返回true。還有在方法里不能返回NullpointerException。
在寫完一個equals方法時一定要考慮是否是對稱的,傳遞的,一致的。自反和非空通常會自動滿足。

忠告:

  • 覆蓋equals時也要覆蓋hashCode()方法。
  • 不要企圖讓equals過于智能,會出現(xiàn)很多麻煩的東西
  • 不要將生命的Object替換成其他的東西。如果是其他的就是重載而不是覆蓋。

第九條:覆蓋equals時總要覆蓋hashCode方法

如果覆蓋了equals而沒有覆蓋hashCode,會違反Object.hashCode的通用約定,導(dǎo)致該類無法結(jié)合所有基于散列的集合一起正常運(yùn)作,這樣的集合包括HashMap,HashSet,HashTable。

Object規(guī)范:

  • 在應(yīng)用的執(zhí)行期間,只要對象的equals方法的比較所用到的信息沒有被修改,那么對這個同一對象調(diào)用多次,hashCode方法都返回同一個正數(shù)。在同一個應(yīng)用程序的多次執(zhí)行過程中,每次執(zhí)行所返回的正數(shù)可以不一致
  • 如果兩個對象根據(jù)equals比較相等,那么hashCode放回的整數(shù)一定相等
  • 如果兩個對象根據(jù)equals比較不相等,那么hashCode放回的整數(shù)有可能相等。但是應(yīng)該知道,不同對象返回hashCode不相等會提高散列表的性能。

第十條:始終要覆蓋toString方法

第十一條:謹(jǐn)慎地覆蓋clone

地十二條:考慮實(shí)現(xiàn)Comparable

書中太啰嗦,感覺沒什么好說的。

轉(zhuǎn)載于:https://www.cnblogs.com/badboyf/p/6283598.html

總結(jié)

以上是生活随笔為你收集整理的Effective java -- 2 对于所有对象都通用到方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。