Loading

第四章 数据类型与类型检验

第四章 数据类型与类型检验

objectives

静态/动态类型检查
可变/不可变数据类型
可变数据类型的危险
不可变数据的优越性
用Snapshot理解数据类型
用集合类表达复杂数据类型

内容

数据类型

类型
变量
java中的类型
基本数据类型
对象数据类型
对象形成层次结构

动态vs静态

类型转换:自动 强制
类型检查:编译阶段 运行阶段
静态检查:强调类型
动态:值

可变vs不可变

1.赋值
2.改变一个变量vs改变变量的值
3.不变性

final:
final类无法派生子类
final变量无法改变值或者引用
final方法不能被子类重写
4.对象的可变与不可变
5.可变与不可变的差异
6.可变的好处
最少化拷贝
更好的性能
多个模块间共享数据
7.可变的风险
不可变更安全 更易理解 more ready for change
Risky example
传递参数
作为返回值
-->改进:防御式拷贝 -->浪费内存 -->不可变的好处
8.别名使得可变类型边的不安全,也就是多个引用

Snapshot diagram

描述程序运行时的内部状态
便于交流
便于解释设计思路

基本类型,对象值的表示
赋值的表示
可变与不可变的表示

不可变的引用:final,即该引用的值不可变--也就是指向的的地址
需要静态检查,否则编译器报错
双线箭头表示
引用不可变,但指向的值可以变(final StringBuilder sb)
可变的引用,也可指向不可变的值(String)

复杂数据类型:Collections and Arrays

Array:长度固定
常用操作:

List:长度可变
List is an interface
members in List must be an object
常用操作:

Set:零个或多个唯一对象的无序集合
Set is an abstract interface
常用操作:

Map:就像字典一样的查找表
Map is an abstract interface
常用操作:

以上各种类型的迭代:

a mutable type:Iterator(迭代器)
两种方法:
next() :返回下一个元素
hasnext() :判断是否达到集合的边界
应用实例:

Mutation undermines an iterator(Myiterator)

java库中提供的iterator会相应的调整索引

有用的不可变类型

基本类型及其封装类型都是不可变的

The Collections utility class has methods for obtaining unmodifiable views of these mutable collections:
– Collections.unmodifiableList
– Collections.unmodifiableSet
– Collections.unmodifiableMap

对于可变数据类型的不可变封装(也可说成包装)
但是这种不可变性是在运行阶段获得的,编译阶段无法依据此不变性进行静态检查
如下所示:

不可变封装的实例:

不可变封装类型:

总结

1.可变性的好处与缺陷
2.理解什么是不可变性,例如什么是不可变对象,什么是不可变引用
3.Snapshot diagrams 帮助可视化的理解各种数据类型及其变化过程
4.关键设计准则:使用不可变性(尽可能使用不可变的对象,引用)

posted @ 2022-06-02 16:03  hiaGeng  阅读(26)  评论(0编辑  收藏  举报