immutable的ADT具有不少特性。
表示独立性:
client使用ADT无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端,除非ADT的操作指明了具体的前置条件和后置条件,否则不能改变ADT的内部表示。
表示泄露:
不仅影响不变性,也影响了表示独立性,无法在不影响客户端的情况下改变其内部表示。最好的办法:使用immutable的类型并且将其声明为(privat final),彻底避免表示泄露,此外还可以使用防御式拷贝。
不变量、表示不变量RI:
由ADT来负责其不变量,与client端的任何行为无关。
RI:R→boolean,某个具体的表示是否是合法的,是所有表示值的一个子集,也包含了所有合法的表示值,一个条件,描述了什么是合法的表示值:
表示空间、抽象空间AF:
ADT开发者关注表示空间R,client关注抽象空间A。
抽象函数:R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。
AF:满射,非单射,未必双射,可知R中的部分值并非合法,在A中无映射。
即使是同样的R,同样的RI,也可能有不同的AF,即解释不同。
例如:
随时检查RI是否满足:在所有可能改变rep的方法内部都要检查。
Observer方法可以不用,但建议也要,防止万一。
要精确记录RI:rep中的所有fileds何为有效。
要精确记录AF:如何解释每一个R值。