Mutable和Immutable
Primitive:int,Integer,String…为Immutable,在
stack中分配内存
Object:Immutable/Mutable,heap中分配内存
防御式拷贝
check
静态类型检查:可在编译阶段发现错误,是关于“类型”的检查,不考虑值
- 语法错误
- 类名/函数名错误
- 参数数目错误
- 参数类型错误
- 返回值类型错误
int a = 5; if (a > 10) { int b = 2; } else { int b = 4; } b *= 3; // b cannot be resolved to a variable --------------- int a = 5; int b; if (a > 10) { b = 1; } b *= 3; // The local variable b may not have been initialized
动态检查:关于“值”的检查
- 非法的参数值(int=int/0会error,double=int/double(0)等返回Infinity不会error)
- 非法的返回值
- 越界
- 空指针
Snapshot diagram
- 基本类型的值
- 对象类型的值
- Immutable的值用双线椭圆
- 值的改变
- final值使用双线箭头
Exception
checked exception:要handle的exception,如:找不到xxx
unchecked exception:不handle,直接退出的exception,如NullPointerException
不用handle的是unchecked,用handle的是checked
Exception类是checked exception
RuntimeException和Error类是unchecked exception
Spec
- spec里不需要解释参数的类型
- 若spec:A>=spec:B,那么满足A的precondition<=B的precondition,且对于满足B的precondition来说,A的postcondition>=B的postcondition。
也就是更弱的precondition或更强的postcondition,意味着更少的实现方式,和更多的用户使用。
两个不可比较的spec也可能有交集。 - 好的spec应该是倾向于陈述性,而不是具体的实现。
好的spec应该既不强也不弱,强会给实现带来负担,弱会给client的使用带来限制。
好的spec应该是解耦的。
Abstract type
- 区分Creator和Producer:A的Creater是用非A的参数来构造一个A并返回,A的Producer是用一个A来构造一个A并返回。
- 区分Creator/Producer和Observor:A的Observor是返回一个非A的对象,A的Creator/Producer是返回一个A的对象。
Spec和Rep
Spec包括函数名,包括类名。
Rep包括field和field的注释。
Representation independence
表示独立性:Client不需要考虑ADT中的具体实现。