重寫java object類的equals方法

覆蓋equals請遵守通用約定
似乎覆蓋equals方法看起來似乎是一件平常甚至極其簡單的事情,
但是有許多覆蓋方式會導(dǎo)致錯誤,并且會表現(xiàn)出超出預(yù)期的行為,
而有可能數(shù)小時也無法找到錯誤的位置。(比如說把參數(shù)改成了非Object類型)
1. 類的每一個實(shí)例在本質(zhì)上都是唯一的
( 從內(nèi)存的角度來講是這樣的),對于代表活動而不是值(value)的類來說更是如此,
例如Thread。
Object提供equals的實(shí)現(xiàn)對于這些類來說是正確的行為
2. 類沒有必要提供“邏輯相等”的測試功能
3.超類已經(jīng)覆蓋了equals方法,超類的行為對于子類來說同樣也是合適的
4.類是私有的或者是包級私有的,可以確定它的equals方法永遠(yuǎn)不會被外界調(diào)用
如果非常想規(guī)避風(fēng)險,可以覆蓋equals方法,
來確保來自O(shè)bject或者超類的方法永遠(yuǎn)不會被意外調(diào)用。
那么什么時候應(yīng)該覆蓋equals方法
如果類具有自己特有的“邏輯相等”概念(不同于對象等同的概念)
而且超類沒有覆蓋equals方法。這通常屬于"值類"(value class)的情形
例如 一個圓 Circle類,內(nèi)有一個私有的成員變量radius半徑
可以認(rèn)為,radius相等代表了兩個實(shí)例在邏輯上相等(或許可以再加上坐標(biāo))
再看String類,程序員在利用equals方法比較值對象的引用時,
更希望知道它們邏輯上是否相等,而不希望知道它們到底是不是同一個對象
為滿足要求,不僅必須覆蓋equals方法,
而且這樣做也使得這個類的實(shí)例
可以被用作映射表 (map) 的鍵 (key) ,或者集合set的元素,
使其表現(xiàn)出符合預(yù)期的行為
注意:有一種“值類”不需要覆蓋equals方法
即實(shí)例受控,甚至于單例模式,
確保每個實(shí)例的“值”至多只存在一個對象,甚至僅能存在一個實(shí)例
(好像太嚴(yán)格了,不過只能存在一個對象有什么可比的呢,就像客戶端只能有一個連接服務(wù)器的socket類實(shí)例一樣)
覆蓋equals時請遵守通用約定
自反性,對稱性以及傳遞性是最基礎(chǔ)的約定
x.equals(x) = x.equals(x) (好像很傻) x.equals(y) = y.equals(x)(這也是最容易出現(xiàn)問題的地方) x.equals(y) = y.equals(z) 那么x.equals(z) == true
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.yijiale78.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文標(biāo)題:淺談java重寫equals方法的種種坑-創(chuàng)新互聯(lián)
文章鏈接:http://www.yijiale78.com/article2/docdic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)頁設(shè)計公司、動態(tài)網(wǎng)站、全網(wǎng)營銷推廣、商城網(wǎng)站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容