摘要
創(chuàng)新互聯(lián)專注于臺山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站建設(shè)。臺山網(wǎng)站建設(shè)公司,為臺山等地區(qū)提供建站服務(wù)。全流程按需開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)本文描述重載equals方法的技術(shù),這種技術(shù)即使是具現(xiàn)類的子類增加了字段也能保證equal語義的正確性。
在《Effective Java》的第8項中,Josh Bloch描述了當(dāng)繼承類作為面向?qū)ο笳Z言中的等價關(guān)系的基礎(chǔ)問題,要保證派生類的equal正確性語義所會面對的困難。Bloch這樣寫到:
除非你忘記了面向?qū)ο蟪橄蟮暮锰?,否則在當(dāng)你繼承一個新類或在類中增加了一個值組件時你無法同時保證equal的語義依然正確
在《Programming in Scala》中的第28章演示了一種方法,這種方法允許即使繼承了新類,增加了新的值組件,equal的語義仍然能得到保證。雖然在這本書中這項技術(shù)是在使用Scala類環(huán)境中,但是這項技術(shù)同樣可以應(yīng)用于Java定義的類中。在本文中的描述來自于Programming in Scala中的文字描述,但是代碼被我從scala翻譯成了Java
常見的等價方法陷阱
java.lang.Object 類定義了equals這個方法,它的子類可以通過重載來覆蓋它。不幸的是,在面向?qū)ο笾袑懗稣_的equals方法是非常困難的。事實上,在研究了大量的Java代碼后,2007 paper的作者得出了如下的一個結(jié)論:
幾乎所有的equals方法的實現(xiàn)都是錯誤的!
這個問題是因為等價是和很多其他的事物相關(guān)聯(lián)。例如其中之一,一個的類型C的錯誤等價方法可能意味著你無法將這個類型C的對象可信賴的放入到容器中。比如說,你有兩個元素elem1和elem2他們都是類型C的對象,并且他們是相等,即 elem1.equals(elm2) 返回ture。但是,只要這個equals方法是錯誤的實現(xiàn),那么你就有可能會看見如下的一些行為:
Set hashSet<c> = new java.util.HashSet<c>(); hashSet.add(elem1); hashSet.contains(elem2); // returns false!</c></c>
網(wǎng)頁標(biāo)題:Java編程中避免equals方法的隱藏陷阱介紹-創(chuàng)新互聯(lián)
本文地址:http://jinyejixie.com/article34/jspse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、自適應(yīng)網(wǎng)站、軟件開發(fā)、全網(wǎng)營銷推廣、響應(yīng)式網(wǎng)站、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容