软件构造第三章 第五部分

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的两个方法即可。 如果一定要判断两个可变 对象看起来是否一致,最好定义一个新的方法。

猜你喜欢

转载自www.cnblogs.com/boston-o/p/11074608.html