第3章
基本数据类型、对象数据类型
一些操作被重载,因为同样的操作名可用于不同的数据类型。
静态类型检查、动态类型检查
静态类型检查:可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。
静态检查:关于“类型”的检查,不考虑值。
动态检查:关于“值”的检查。
Mutable/Immutable
所以,尽量使用final变量作为方法的输入参数、作为局部变量。 final表明了程序员的一种“设计决策”。
不变对象:一旦被创建,始终指向同一个值/引用;
可变对象:拥有方法可以修改自己的值/引用。
值的改变、引用的改变
使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收)。
可变类型最少化拷贝以提高效率。
使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据。
但是,不可变类型更“安全”,在其他质量指标上表现更好。
防御式拷贝
安全的使用可变类型:局部变量,不会涉及共享;只有一个引用。
如果有多个引用(别名),使用可变类型就非常不安全。
Snapshot diagram
a code-level, run-time, and moment view
不可变对象:用双线椭圆。
不可变的引用:用双线箭头。
引用是不可变的,但指向的值却可以是可变的。
可变的引用,也可指向不可变的值。
List:
Set:
Map:
Specification、前置/后置条件
行为等价性
站在客户端视角看行为等价性。
规约的强度
ADT操作的四种类型
ADT是由操作定义的,与其内部如何实现无关!
表示独立性
不变量、表示不变量RI
表示泄漏
表示空间、抽象空间、AF
以注释的形式撰写AF、RI
即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。
接口、抽象类、具体类
接口:确定ADT规约。
类:实现ADT。
继承、override
重写的时候,不要改变原方法的本意。
多态、overload
泛型
等价性equals()和==
equals()的自反、传递、对称
hashCode()
可变对象的观察等价性、行为等价性