软件构造第三章 第五部分
ADT和OOP中的等價性
equal和==
hashcode()和equals()方法總是一起被重寫
“==”:引用等價性,指向相同的內存地址,
equals():對象等價性,在自己定義的ADT時,需要重寫Object的equals()/
"=="是對基本數據類型,而對于對象類型,使用equals()。
?
equal的自反、傳遞、對稱
等價的三種定義
1)若AF映射到同樣的結果,則等價
2)若兩個對象之間滿足自反,傳遞、對稱的關系,那么為等價關系
3)站在外部觀察者角度發現二者沒有區別(對于ADT來說,觀察就表示調用該類的運算符)
除非對象被修改了,否則多次調用該對象得到的結果應該時一樣的
相等的對象,其hashcode()的結果必須一致
非空:a.equals(null)返回false
hashcode()
重寫equal必須重寫hashcode,相同的對象一定要有相同的hashcode
?
可變對象的觀察等價性、行為等價性
Object中缺省使用“==”來判斷兩個對象是否相同
instanceof()操作應該只在equals方法之內使用(不好的操作)
觀察等價性:在不改變狀態的情況下,兩個可變對象是否看起來一致:
1)調用:observer、producer、creater
2)不改變狀態
行為等價性:調用對象的任意方法、都展現除一致的結果。
對于可變的對象來說、往往傾向于實現嚴格的觀察等價性,但有些時候,觀察等價性可能導致bug,甚至破壞RI
比如:
如果某個mutable的對象包含在Set集合類中,當其發生改變后,集合類的行為不確定性需要小心。
對可變類型,實 現行為等價性即可 。也就是說,只有指 向同樣內存空間的objects,才是相等的。?所以對可變類型來說,無需重寫這兩個函數,直接繼承 Object的兩個方法即可。?如果一定要判斷兩個可變 對象看起來是否一致,最好定義一個新的方法。
轉載于:https://www.cnblogs.com/boston-o/p/11074608.html
總結
以上是生活随笔為你收集整理的软件构造第三章 第五部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事件模型、事件流(冒泡与捕获)、事件代理
- 下一篇: Dynamics CRM 同一实体多个F