软件构造-02
(一)数据类型与类型检查
基本数据类型:有值无ID,栈
抽象数据类型:有值和ID,堆
静态类型检查:类型检查
动态类型检查:值的检查(空指针引用,越界访问、整数除0)
不检查但会出现错误结果(避免):(浮点数除0、整数溢出)
(二)immutable 与 mutable
不可变数据类型:内部无mutator,每次改变都会产生新的副本
可变数据类型:内部有mutator,可以改变类的值
final的使用:
final表明了程序员的一种“设计决策”
final类无法派生子类
final变量无法改变值/引用
immutable变量被final修饰后无法改变
mutable变量被final修饰后引用不可改变
final方法无法被子类重写
集合类的使用:
集合类均为mutable变量,可以包装为UnmodifiableCollections作为immutable类型
mutable存在多引用时修改容易出现风险
(三)画snapshot图
(四)设计规约
- 前置条件与后置条件:
前置条件满足了,后置条件必须满足;
前置条件不满足,后置条件不一定满足(输入错误,可以抛出异常)
- 规约的书写:
作为方法的注释书
@param
@return
@throws
- 规约的强度:
前置条件越弱,规约越强。
后置条件越强,规约越强
(五)ADT的设计 - 四种操作:
creator:可以是构造器或者工厂方法
producer:
mutator:
observer: - 表示独立性 与 表示泄露:
(1)类内部的rep不应该泄露给外部
例如:rep改成final + private ;规约中不包含rep信息,只提供抽象空间的信息 ; mutable类型在返回和入口处需要防御性复制
(2)信息封装,rep的性质由类自身保证,不依赖客户端
例如:checkRep - RI 与 AF
(1)RI:类自身需要保证的rep的性质
(2)AF:开发者的表示空间 到 客户端的抽象空间 的映射(满射)
(3)RI 与 AF以注释书写,类层面
(六)OOP的设计 - 抽象到具体的设计特点
接口 抽象类 具体类
(1)继承 和 重写 - 多态的特性
(1)子类型多态(运行时确定)
(2)重载多态(编译时确定)
重载:方法参数列表必须改变,只有返回值改变会报错。
(3)泛型多态 - 重写 与 重载 的区别
重写:运行时确定、动态类型检查、满足LSP原则
重载:编译时确定、静态类型检查
(七)等价性
- 等价性:
对于immutable类型:一般采取对象等价性
(1)引用等价性:对象ID相同
(2)对象等价性:a。规约一致变量相同 ; b。自反、对称、传递 ;c。客户端观察行为一致
对于mutable类型:根据情况而定
(1)行为等价性:调用各种方法后依旧保持等价
(2)观察等价性:客户端角度观察行为一致 - 等价性在equals中的具体应用
(1)immutable变量:
不重写equals:Object中默认实现的equals,即判断引用是否相同。
重写equals方法和hashcode方法:判断对象等价性
(2)mutable变量:
重写equals 和 hashcode方法:实现观察等价性,但类发生变化后在hash容器中出现错误
不重写equals:判断引用是否相同