第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()

可变对象的观察等价性、行为等价性

数据类型与对象特性
1402

被折叠的 条评论
为什么被折叠?



