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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Effective Java之覆盖equal时要遵守通用约定(八)

發布時間:2024/2/28 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective Java之覆盖equal时要遵守通用约定(八) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先介紹一下Object的equal作用,==代表物理上的相等,equal代表邏輯上的相等,Object的equal的方法其實等同于==,這是因為它的邏輯是“如果對象物理相等,那么它們就邏輯相等”。
?

1.何時不需要覆蓋

1.如果每個實例的本質是唯一的,也就是說只有自己才會等于自己,那么它的equal方法應該相當于它的==,所以它從Object繼承過來的方法剛好滿足條件了,不需要覆蓋。

2.不關心它的“邏輯相等”,既然都不關心了,那還寫什么?

3.超類覆蓋的equal方法,對子類同樣適用的情況下,就不用覆蓋了。比如Set實現了從AbstractSet繼承的方法,所以它不用去覆蓋了。
?

2.何時需要覆蓋

1.有的類的equal永遠也不會調用的情況,那么應該覆蓋equals方法,讓它在調用時拋出錯誤。

2.如果希望定義特有的”邏輯相等”的情況,可以覆蓋equals,比如定義市民類,如果兩個市民的身份證字段相等,那么兩個市民類相等,這樣的邏輯。
?

3.覆蓋需要遵守的約定

在覆蓋equals方法時,必須遵守它的通用約定:

1)自反性: x.equals(x) 必須返回true 。實例自身必然邏輯相等。

2)對稱性: x.equals(y) 與 y.equals(x) 返回結果應該相同,同為true或者同為false

3)傳遞性: x.equals(y)返回true,y.equals(z)返回true,則x.equals(z)應該返回true。

4)一致性: 只要比較的實例對象的關鍵屬性值沒有改變 ,那么無論調用多少次equals方法返回的結果都應該相同,一致。

5)對于非null的x實例,x.equals(null) 永遠返回false。
?

這一章的內容十分地充實,這里,我只能總結一下書中重要的內容:

1.不要企圖讓一個類和一個它的非子類進行equal對比,比如 市民類.equal(String identity),
希望只要市民的身份證號等于字符串類型的identity就返回true,這樣是不可行的,因為必然會違反對稱性,除非你能去修改String類?

2.我們無法在擴展可實例化的類的同時,既增加新的值組件,同時又保留equal約定。
也就是遇到可實例化的父類和子類,而且子類擴展了父類的問題時,會遇到很尷尬的問題,這里應該認真看一下書~

書中寫到了父類和子類的各種糾纏~解決的一種方法,也可以說是權宜之計,就是割斷父子關系。。
也就是利用復合優于繼承的原則;原來的子類不是擴展了父類嗎,那么我讓父類成為原來子類的一個私有域,利用復合的方式組裝一個類出來。既然不存在父子關系了,父子進行對比產生的種種糾纏也就不復存在了。

書中也有舉到一個很有意思的例子,TimeStamp對Date進行擴展,增加了nanoseconds域,由于上面的規則“我們無法在擴展可實例化的類的同時,既增加新的值組件,同時又保留equal約定”,所以設計師也無法進行正確的操作,于是TimeStamp有個免責聲明,告誡開發者不要同時使用TimeStamp和Date,也就是不讓程序員糾纏在父子的問題上了。

這里有個里式替換原則,可以注意一下:一個類型的任何重要屬性也將適用于它的子類型,因此為該類型編寫的任何方法,在他的子類型也應該同樣運行得很好
?

4.如何使用?


1.先用“==”操作符號判斷“參數是否為這個對象的引用”,如果是,那直接返回true。
這其實是一種性能優化,不進行這個操作也會得到一樣的結果,所以需要根據每次比較的代價判斷是否先用“==”,代價大就需要優化。

2.用instanceof檢查“參數是否為正確的類型”。

3.再將參數object對象轉成正確的類型。

4.自己定義“邏輯相等”。

5.寫完有仔細思考有沒有滿足對稱性,傳遞性,一致性。

例子:

public class Citizen {private String name ;private String Identity;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdentity() {return Identity;}public void setIdentity(String identity) {Identity = identity;}@Overridepublic boolean equals(Object obj) {if(this == obj) {return true;}if(!(obj instanceof Citizen)) {return false;}Citizen citizen = (Citizen)obj;return this.getIdentity().equals(citizen.getIdentity());}}

這里的 先用“==”操作符號判斷“參數是否為這個對象的引用” 可以不需要。

總結

以上是生活随笔為你收集整理的Effective Java之覆盖equal时要遵守通用约定(八)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 自拍偷拍亚洲一区 | 91高清在线免费观看 | 麻豆911| 九九九在线视频 | jizzjizz亚洲| 极品一区| 99re在线播放 | 成人自拍偷拍 | 亚洲永久无码7777kkk | 欧美在线日韩 | 狠狠躁夜夜躁xxxxaaaa | h毛片| 性歌舞团一区二区三区视频 | 快播久久 | 日本亚洲色大成网站www久久 | a√在线| 超清纯大学生白嫩啪啪 | 亚洲性视频 | 毛片毛片毛片毛片毛片毛片 | 涩涩爱影院| 激烈娇喘叫1v1高h糙汉 | 手机在线一区二区三区 | 欧美另类视频 | 黄色一级片视频 | www一区二区三区 | 少妇久久久久久被弄到高潮 | 国产精品17p | 91视频社区 | 成人网入口 | 亚洲第一页夜 | 六月丁香婷婷综合 | 黄色片网站免费在线观看 | 日韩久久久久久久久久 | 高h乱l高辣h文短篇h | 午夜性生活视频 | 午夜伦理剧场 | 国产成人观看 | 国产欧美一区二区三区视频在线观看 | 日本美女性爱视频 | 国产伦精品一区二区三区免.费 | 亚洲成人黄色 | 久久亚洲精品中文字幕 | 国产又大又黑又粗 | 亚洲黄页网站 | jizz在线观看 | 激情文学久久 | 伊人免费在线观看 | 四虎午夜影院 | 黄色免费在线观看视频 | 国产一在线 | 日韩在线观看免费 | 水果视频污 | 久久综合88 | av资源网站| 在线免费看黄视频 | 999成人网| 欧美片免费网站 | 日韩亚洲第一页 | 欧美精品激情视频 | 色视频线观看在线播放 | 欧美性大战久久久久久 | 日韩在线视频一区 | 51av在线| 色婷婷丁香 | 欧美变态口味重另类 | 精品日韩在线观看 | 中文字幕一区二区三区电影 | 欧美黄色大片免费观看 | 欧美日韩字幕 | 免费不卡视频 | 免费成人av片 | 国产精品嫩| 天天色亚洲 | 91天堂素人 | 国产东北真实交换多p免视频 | 成人av动漫在线观看 | 国产第九页 | 日本做爰高潮又黄又爽 | 在线观看网站 | 九九热视频免费观看 | 欧美亚洲网站 | 综合99| 99视频免费在线观看 | 中文精品久久久久人妻不卡 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 观看av| 亚洲欧洲一区二区在线观看 | 久久久一级黄色片 | 99久久久无码国产精品性色戒 | 黄色一级片网站 | av福利影院 | 舐め犯し波多野结衣在线观看 | 久久99久久久 | 亚洲在线中文字幕 | 欧美成人乱码一二三四区免费 | 日本一级大毛片a一 | 亚洲国产精品久久精品怡红院 | 久久久精品网站 | 国产草草视频 |