immutabile:String,BigInteger基本类型以及其封装对象类型,包装器(包装器的不可变是在运行阶段获得的,编译阶段无法据此进行静态检查)
mutable:StringBuilder,List,Set,Map
防御式拷贝
安全的使用可变类型:局部变量;不会涉及共享;只有一个引用
final:引用不可变但是指向的值是可变的
可变的引用也可以只想不变的值
Iterator:mutable迭代器
规约,行为等价性
前置条件:对客户端的约束,在使用方法时必须满足的条件
后置条件:对开发者的约束,方法结束时必须满足的条件
前置条件满足的情况下,必须满足后置条件
静态类型声明是一种规约,可据此进行静态类型检查
方法前的注释也是一种规约,但需人工判定是否满足
内部实现的细节不能在规约中呈现,应该放在代码实现体内部注释
不限定太强的前置条件而是在后置条件中抛出异常:输入不合法
抽象数据类型:ADT
抽象类型:强调作用于数据上的操作,无需关心数据时如何存储的,只需设计和使用操作即可。
可变类型的对象:提供了可以改变其内部数据的值的操作
不可变类型的对象:其操作不改变内部值而是构造新的对象
Creators:可能实现为构造函数或者静态函数
Producers:一般是返回相同类型的对象
Observers:
Mutators:一般情况下返回值为void(改变对象属性)
表示独立性:client在使用ADT时无需考虑内部实现,ADT内部表现不应影响外部spec和客户端
保持不变性,避免表示泄露
表示不变性RI:某个具体的表示是否是合法的
不同的内部表示需要设计不同的AF和RI