一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Effective Java 筆記(三)...

 -ー意孤行ノ 2009-03-19
NO.7 在改寫equals方法時請遵守通用約定
下列情況是不需要改寫equals方法的:
1。同一個類的不同實例本質(zhì)上是唯一的,就是個實例都有自己的本體(Identify)。
2。不關(guān)心該類是否提供了邏輯相等的功能。
3。父類已經(jīng)改寫過equals方法,對于子類來說,繼承過來的equals方法已經(jīng)是最合適的了。
4。一個類是私有的或者是包可見的,且確定它的equals方法不會被調(diào)用。
 
對于需要改寫equals方法的時候,應(yīng)該遵守如下約定:
1。自反性,即x.equals(x)為true.
2。對稱性,即當(dāng)且僅當(dāng)x.equals(y)為true時y.equals(x)也一定為true。
3。傳遞性,即對任意的x,y,z,如果x.equals(y)為true,并且y.equals(z)也為true,那么x.equals(z)也必須為true.
4。一致性,即對于任意的x,y,如果x,y都沒有被修改的話,那么多次調(diào)用x.equals(y)要么一致地返回ture,要么一致地返回false.
5。對于非空的引用x,x.equals(null)一定要返回false.
 
改寫equals方法時的建議:
1。用==操作符檢查實參是否為指向?qū)ο蟮耐粋€引用。
2。使用instanceOf檢查實參是否是正確的類型。
3。在2的基礎(chǔ)上,把實參轉(zhuǎn)換成正確的類型。
4。檢查實參的域與當(dāng)前對象的域值是否相等。
5。編寫完equals方法后,檢查是否滿足等價關(guān)系。
例如:
  1. public boolean equals(Object o)
  2. {
  3.        if(o== thisreturn true;
  4.        if(!(o instanceof xxxx) return false;
  5.        xxx in = (xxx)o;
  6.        return ……..
  7. }
改寫equals方法的告誡:
1、不要企圖讓equals方法做太多事。
2、不要使equals依賴不可靠的資源,否則會違背一致性。
3、不要將equals中的對象裝換為其他的類型。
4、要注意的時候不要提供這樣的方法public boolean equals(MyClass o)這樣是重載并不是覆蓋Object的equals方法。
總結(jié):不用重寫equals方法就盡量不要去找麻煩,確實需要改寫equals方法時,遵守通用約定,因為對象會在程序中不停的傳遞,所以可能會導(dǎo)致程序運行不正常,甚至崩潰而很難找到程序崩潰的原因??傊?,還是遵守約定吧!

NO.8 改寫equals方法時必須覆蓋hashCode方法
       這點必須切忌,不然在你和hash-based集合打交道的時候,錯誤就會出現(xiàn)了。關(guān)鍵問題在于一定要滿足相等的對象必須要有相等的hashCode。如果你在PhoneNumber類中覆蓋了equals方法,但是沒有覆蓋hashCode方法,那么當(dāng)你做如下操作的時候就會出現(xiàn)問題了。
  1. Map m = new HashMap();
  2. m.put(new PhoneNumber(408,863,3334),”ming”)
當(dāng)你調(diào)用m.get(new PhoneNumber(408,863,3334))的時候你希望得到ming但是你卻得到了null,為什么呢因為在整個過程中有兩個 PhoneNumber的實例,一個是put一個是get,但是他們兩個邏輯相等的實例卻得到不同的hashCode那么怎么可以取得以前存入的ming 呢。


NO.9 總是要改寫toString()方法
        在Object的toString方法返回的形式是Class的類型加上@加上16進制的hashcode,非常難以理解。最好在自己的類中提供toString方法更好的表述實例的信息,不然別人怎么看得明白呢。
        在實際應(yīng)用中,toString方法應(yīng)該返回對象中包含的所有令人感興趣的信息。同時,最好在程序中提供一個相匹配的構(gòu)造函數(shù)或者靜態(tài)工廠方法,便于程序員在對象和它的字符串表示之間進行來回轉(zhuǎn)換。
       在實現(xiàn)toString方法的時候,必須要做出是否在文檔中指定返回值的格式的決定。指定格式可以被用來做為一種標(biāo)準(zhǔn)的,無二意性的表達形式,但這樣也會使字符串的表示嵌入到永久數(shù)據(jù)中,如果以后改變了表達形式,則會影響到系統(tǒng)的代碼和數(shù)據(jù)。不管你是否決定指定格式,都應(yīng)該在代碼中清晰的表明自己的意圖??稍谒诘念愔袨閠oString返回值中所包含的信息提供一種編程訪問途徑,用來獲取toString方法返回字符串中的信息,避免程序員自己去解析字符串而導(dǎo)致的錯誤。


NO.10 謹慎地改寫clone(clone方法詳解請參見java clone方法使用詳解
      一個對象要想被Clone,那么要實現(xiàn)Clone()接口,這個接口沒有定義任何的方法,但是如果你不實現(xiàn)這個接口的話,調(diào)用clone方法的時候會出現(xiàn)CloneNotSupportedException,這就是作者叫做mixin的接口類型。通常clone()方法可以這樣覆蓋
 
但是當(dāng)你要clone的類里面含有可修改的引用字段的時候,那么你一定要把整個類的藍圖進行復(fù)制,如果對你clone得到的對象進行修改的時候還會影響到原來的實例,那么這是不可取的。所以應(yīng)該這樣clone()

其中elements是stack類中可修改的引用字段,注意如果elements是final的話我們就無能為力了,因為不能給他重新賦值了.其實如果不是必須的話,根本就不用它最好。
      clone方法如果實現(xiàn)得不當(dāng)會給系統(tǒng)帶來隱藏的bug,如果非要使用類似的功能最好的辦法是提供某些其他的途徑(拷貝構(gòu)造函數(shù)或者提供一個靜態(tài)工廠方法來替代構(gòu)造函數(shù))來替代對象的拷貝,或者干脆不提供這樣的能力。
      Cloneable有很多問題,所以安全的說,其他的接口不應(yīng)該擴展(extend)這個接口,并且為了繼承而設(shè)計的類也不應(yīng)該實現(xiàn)(implement)這個接口。


NO.11 考慮實現(xiàn)Comparable接口
      compareTo方法是java.lang.Comparable接口中的唯一方法,它允許進行簡單的相等比較,也允許執(zhí)行順序比較,一個類實現(xiàn)了comparable接口就表明他的實例具有內(nèi)置的排序關(guān)系。Java平臺庫中所有的值類都實現(xiàn)了Comparable。將當(dāng)前對象與指定對象進行順序比較的時,返回負整數(shù),0或者正整數(shù)(<、=、>),如果指定對象的類型無法進行比較,則拋出ClassCastException或者NullPointException異常,compareTo方法應(yīng)遵守如下限制條件:自反性、對稱性、傳遞性和非空性的限制條件。在實現(xiàn)數(shù)值比較的compareTo方法時還要防止值域溢出的情況。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    激情五月综五月综合网| 亚洲深夜精品福利一区| 亚洲精品一二三区不卡| 国产日韩在线一二三区| 九九视频通过这里有精品| 厕所偷拍一区二区三区视频| 国产目拍亚洲精品区一区| 观看日韩精品在线视频| 日本国产欧美精品视频| 婷婷亚洲综合五月天麻豆| 色小姐干香蕉在线综合网| 老熟妇乱视频一区二区| 97人妻精品免费一区二区| 人妻中文一区二区三区| 久久三级国外久久久三级| 国产精品超碰在线观看| 精品国产亚洲av久一区二区三区 | 国产成人亚洲欧美二区综| 隔壁的日本人妻中文字幕版| 亚洲精品国产精品日韩| 亚洲中文字幕综合网在线| 暴力三级a特黄在线观看| 中文字幕区自拍偷拍区| 国产免费无遮挡精品视频| 午夜小视频成人免费看| 东京热男人的天堂久久综合| 久久国产精品熟女一区二区三区| 欧美日韩精品久久第一页| 日韩美成人免费在线视频| 很黄很污在线免费观看| 国产免费黄片一区二区| 一区二区免费视频中文乱码国产| 国产午夜精品亚洲精品国产| 中文字幕在线区中文色 | 日韩人妻少妇一区二区| 东北老熟妇全程露脸被内射| 国产精品丝袜美腿一区二区| 嫩呦国产一区二区三区av| 国产黄色高清内射熟女视频| 国产综合一区二区三区av| 色婷婷在线视频免费播放|