十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
重寫(xiě)java object類(lèi)的equals方法
覆蓋equals請(qǐng)遵守通用約定
似乎覆蓋equals方法看起來(lái)似乎是一件平常甚至極其簡(jiǎn)單的事情,
但是有許多覆蓋方式會(huì)導(dǎo)致錯(cuò)誤,并且會(huì)表現(xiàn)出超出預(yù)期的行為,
而有可能數(shù)小時(shí)也無(wú)法找到錯(cuò)誤的位置。(比如說(shuō)把參數(shù)改成了非Object類(lèi)型)
1. 類(lèi)的每一個(gè)實(shí)例在本質(zhì)上都是唯一的
( 從內(nèi)存的角度來(lái)講是這樣的),對(duì)于代表活動(dòng)而不是值(value)的類(lèi)來(lái)說(shuō)更是如此,
例如Thread。
Object提供equals的實(shí)現(xiàn)對(duì)于這些類(lèi)來(lái)說(shuō)是正確的行為
2. 類(lèi)沒(méi)有必要提供“邏輯相等”的測(cè)試功能
3.超類(lèi)已經(jīng)覆蓋了equals方法,超類(lèi)的行為對(duì)于子類(lèi)來(lái)說(shuō)同樣也是合適的
4.類(lèi)是私有的或者是包級(jí)私有的,可以確定它的equals方法永遠(yuǎn)不會(huì)被外界調(diào)用
如果非常想規(guī)避風(fēng)險(xiǎn),可以覆蓋equals方法,
來(lái)確保來(lái)自O(shè)bject或者超類(lèi)的方法永遠(yuǎn)不會(huì)被意外調(diào)用。
那么什么時(shí)候應(yīng)該覆蓋equals方法
如果類(lèi)具有自己特有的“邏輯相等”概念(不同于對(duì)象等同的概念)
而且超類(lèi)沒(méi)有覆蓋equals方法。這通常屬于"值類(lèi)"(value class)的情形
例如 一個(gè)圓 Circle類(lèi),內(nèi)有一個(gè)私有的成員變量radius半徑
可以認(rèn)為,radius相等代表了兩個(gè)實(shí)例在邏輯上相等(或許可以再加上坐標(biāo))
再看String類(lèi),程序員在利用equals方法比較值對(duì)象的引用時(shí),
更希望知道它們邏輯上是否相等,而不希望知道它們到底是不是同一個(gè)對(duì)象
為滿(mǎn)足要求,不僅必須覆蓋equals方法,
而且這樣做也使得這個(gè)類(lèi)的實(shí)例
可以被用作映射表 (map) 的鍵 (key) ,或者集合set的元素,
使其表現(xiàn)出符合預(yù)期的行為
注意:有一種“值類(lèi)”不需要覆蓋equals方法
即實(shí)例受控,甚至于單例模式,
確保每個(gè)實(shí)例的“值”至多只存在一個(gè)對(duì)象,甚至僅能存在一個(gè)實(shí)例
(好像太嚴(yán)格了,不過(guò)只能存在一個(gè)對(duì)象有什么可比的呢,就像客戶(hù)端只能有一個(gè)連接服務(wù)器的socket類(lèi)實(shí)例一樣)
覆蓋equals時(shí)請(qǐng)遵守通用約定
自反性,對(duì)稱(chēng)性以及傳遞性是最基礎(chǔ)的約定
x.equals(x) = x.equals(x) (好像很傻) x.equals(y) = y.equals(x)(這也是最容易出現(xiàn)問(wèn)題的地方) x.equals(y) = y.equals(z) 那么x.equals(z) == true
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。