对于RI(表示不变量),仅仅宽泛的说什么区域是合法的并不够,你还应该说明是什么使得它合法/不合法。
对于AF(抽象函数)来说,仅仅宽泛的说抽象域表示了什么并不够。抽象函数的作用是规定合法的表示值会如何被解释到抽象域。作为一个函数,我们应该清晰的知道从一个输入到一个输入是怎么对应的。
- 相等应该满足等价关系(自反、对称、传递)。
- 相等和哈希必须互相一致,以便让使用哈希表的数据结构(例如 HashSet 和 HashMap)正常工作。
- 抽象函数是不可变类型相等的比较基础。
- 索引是可变类型相等的比较基础。这也是确保相等一致性和保护哈希表不变量的唯一方法。
相等是实现抽象数据类型中的一部分。
在Java代码中,接口被用的很广泛(但也不是所有类都是接口的实现),这里列出来了几个使用接口的好处:
- 接口对于编译器和读者来说都是重要的文档:接口不仅会帮助编译器发现ADT实现过程中的错误,它也会帮助读者更容易/快速的理解ADT的操作——因为接口将ADT抽象到了更高的层次,用户不需要关心具体实现的各种方案。
- 允许进行性能上的权衡:接口使得ADT可以有不同的实现方案,而这些实现方案可能在不同环境下的性能或其他资源特性有很大差别。使用者可以根据自己的环境/需求选择合适的实现方案。但是,在我们选择特定的方案后,我们依旧要保持代码的表示独立性,即当ADT发生(内部)改变或更换实现方案后代码依然能正常运行。
- 通过未决定的规格说明给实现者以定义方法的自由:例如,当把一个有限集合转化为一个列表的时候,有一些实现可能是使用较慢的方法,但是它们确保这些元素在列表中是排好序的;而其他的实现可能是不管这些元素转换后在列表中的排序,但是它们的速度更快。
- 一个类具有多种“视角”:在Java中,一个类可以同时实现多个接口,例如,一个能够显示列表的窗口部件就可能是一个同时实现了窗口和列表这两个接口的类。这反映的是多种ADT特性同时存在的特殊情况。
- 允许不同信任度的实现:另一个多次实现一个接口的原因在于,你可以写一个简单但是非常可靠的实现,也可以写一个很“炫”但是bug存在的几率(稳定性)高一些的实现。而使用者可以根据实际情况选择相应的方案。



