第三章:
一、数据类型与类型检验
1.基本数据类型(小写开头如int)和对象数据类型(大写开头如String):
基本数据类型为immutable,在栈中分配内存
对象数据类型在堆中分配内存。
基本数据类型可以包装成对象数据类型
2.静态类型检查和动态类型检查:
静态(主要关于类型):语法,类/函数名,参数数目,参数类型,返回值类型。
动态(主要关于值):非法参数值,非法返回值,越界,空指针。
3.Mutability and Immutability:
Immutability:一旦创建,其值不变,可以用final声明。引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变
对于final:final类无法派生子类;final方法无法被子类override;final变量无法改变值/引用。
Mutability:可以用方法改变其值/引用。
eg:String:String是一个不可变的数据类型。
StringBuilder: StringBuilder是一个可变的数据类型。
可变存在的风险:客户端可能修改数据。
可以使用防御式拷贝进行返回。即创建一个新的返回对象返回。即使修改也不会对原有数据造成影响。
4.快照图:描述程序运行时的内部状态。
不可变对象:双线椭圆。
不可变引用:双线箭头。
5.Iterator:迭代器(mutable)
6.常用不可变与可变:
基本类型及其封装类不可变。
List,Set,Map是可变的,可以用Collections.unmodifiedList()等防止修改
可以用List.of创建不可变集合,如:
List a = List.of(“lion”, “tiger”, “bear”);
二、设计规约
1.前置条件:客户端需要满足的条件。
2.后置条件:开发者必须满足的条件。
3.spec格式
4.除非后置条件声明过,否则方法尽量不改变传入参数。
5.更强的spec:更弱的前置条件(要求的更少),更强的后置条件(承诺的更多)。
后置条件比较时,要以同一强的前置条件为前提,进行比较
三、抽象数据类型 (ADT)
1.可变数据类型:提供了可改变其内部数据的值的操作。
2.不变数据类型: 其操作不改变内部值,而是构造新的对象。
3.Creators(构造器),Producers(生产器),Observers(观察器),Mutators(变值器)。
Creators(构造器):构造器将某一个(某一些)与被构造数据类型不同的数据类型的对象作为参数,构造某个数据类型的具体对象。
Producers(生产器):生产器利用某一类型的数据对象构造出该类型的新的数据对象
Mutator(变值器):一般返回void,也有可能其他。
4.表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
5.ADT的测试:
测试creators, producers, and mutators:调用observers来观察这些 operations的结果是否满足spec; §
测试observers:调用creators, producers, and mutators等方法产生或改变对象,来看结果是否正确。
6.保持不变性和避免表示泄漏,是ADT最重要的一个Invariant。
7.RI/AF/Safety from rep exposure:
RI:规定合法值
AF:解释合法值(映射)
Safety from rep exposure:如何防止表示泄露的问题。
checkrep():根据RI写,在所有可能改变rep的方法上都要加上。
四、ADT和OOP中的“等价性”
1.==与.equals():==是引用等价性,.equals是对象等价性。一般在immutable中区分,引用等价性即在内存中的引用是否相同,.equals即根据AF映射关系是否映射相同。
2.若两个对象.equals判断相等,则必须有相同的hashCode。