一、数据类型
基本数据类型:只有值,没有ID,不能赋值为null =>immutable 在栈中分配内存
对象数据类型:有值和ID,部分mutable 部分immutable 在堆中分配内存
二、类型检查
1.静态类型检查:不考虑值,bug被发现在run之前=>在编译阶段进行检查;与特定值无关
(注:动态类型的语言也会有这个检查)
2.动态类型检查:非法参数(除0等),返回值错误,超出索引值,调用空对象的方法;针对特定值引起的错误来进行检查
3.没有检查:舍入、移出、浮点数NaN
三、可变性
先看一例:对变量赋值=>改变变量指向不同的值,而对list的改变=>改变内容时是在改变内部内容的引用
不变性:部编数据类型创建完成之后值不可再修改,这里提到一个final关键字 =>对不可变的引用提供了静态类型检查
final:1.final class不能被继承 2.final variable 不能改变值 3.final method不可以被子类重写
四、ADT
1.Creator: 产生新对象=>构造方法或是工厂方法
Producers:在已有对象的基础上产生新对象
Observers:输入抽象类型对象,返回其他类型
Mutator:改变对象
2. 设计原则:简单操作、内聚(单一职责)、操作集完备、不应该混合无关/通用的特征
3. RI:表示独立=>好的ADT应该是独立的 只有当我们明确ADT前置条件和后置条件的相关操作,调用者才知道可以依赖哪些内容;对于RI,现有调用者仅仅依赖其public方法,而不依赖private字段,因此我们的ADT可以不检查其他调用者的情况下进行更改
4.保持不变量:在任何时候都保持true ->由ADT来负责不变量,与客户端无关
表示泄漏RE:不仅影响不变性,也影响表示独立,无法不影响客户端的情况下改变内部表示=>策略:防御性拷贝
5.AF:表示空间R与抽象空间A之间存在映射关系 =>AF就是R与A之间映射关系的函数:是满射,未必单射,未必双射
R部分值非合法->在A中无映射值
6.测试ADT:checkRep()在所有可能改变rep的方法内都要检查,Observer方法可以不用,但建议检查
7.需要精确记录1.RI:rep中所有fields何为有效,对每一个fields以及多个fields之间进行条件限定 2.AF如何解释每一个R值,给出客户端看到的A值是什么 3.RE安全声明:给出理由,证明代码并未对外泄漏内部表示