第五部分

Posted boston-o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五部分相关的知识,希望对你有一定的参考价值。

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

以上是关于第五部分的主要内容,如果未能解决你的问题,请参考以下文章

软件构造 第七章第五节 测试

软件构造 第五章第一节 可复用性的度量形态和外部观察

软件构造第五章第三节 可复用的设计模式

软件构造 第三章第五节 ADT和OOP中的等价性

软件工程第五周思考题

智能驾驶功能软件平台设计规范第五部分:定位功能服务接口