数据类型与类型检验

一、Data type in programming languages

数据类型:一组值以及可以对其执行的操作
变量:用特定数据类型定义,可存储满足类型约束的值
JAVA数据类型: 基本数据类型、对象数据类型

二、Static vs. dynamic data type checking

Java is a statically-typed language.
静态类型语言:所有变量的类型在编译时已知,因此编译器可以推导表达式类型;在编译阶段进行类型检查。
静态检查:可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。关于“类型”的检查,不考虑值。
能检查的错误:语法错误、类名/函数名错误、参数数目/类型错误、返回值类型错误
动态类型语言在运行阶段进行类型检查
动态检查:关于“值”的检查
能检查的错误:非法的参数值、非法的返回值、越界、空指针、无检查,直接报错
静态检查 >> 动态动态 >> 无检查
三、 Mutability and Immutability
改变一个变量:将该变量指向另一个存储空间。
改变一个变量的值:将该变量当前指向的存储空间中写入一个新的值。

不变性:重要设计原则

不变数据类型:一旦被创建,其值不能改变
如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变指向其他对象
编译器进行静态类型检查时,如判断final变量首次赋值后发生了改变,会提示错误。
final类无法派生子类;final变量无法改变值/引用;final方法无法被子类重写。
不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用
以String类型为例:

 

 

使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收)。
可变类型因为最少化拷贝,可以提高效率

使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据。

不可变类型更“安全”,在其他质量指标上表现更好。
可变性使得难以理解程序正在做什么,更难满足方法的规约。
折中,看你看重哪个质量指标。
使用Mutable的风险: 传递可变对象是一个潜在的错误源泉,一旦无意中改变,则这种错误非常难于跟踪和发现。对其他程序员来说,也难以理解。
解决方法:使用防御式拷贝
大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费。如果使用不可变类型,则节省了频繁复制的代价。
不可变类型不需要防御式拷贝 。
安全的使用可变类型:局部变量,不会涉及共享;只有一个引用。
如果有多个引用(别名),使用可变类型就非常不安全。
四、Snapshot diagram as a code-level, run-time, and moment view
Snapshot diagrams: 用于描述程序运行时的内部状态
Why we use snapshot diagrams?
1. 便于程序员之间的交流
2.便于刻画各类变量随时间变化
3.便于解释设计思路

 

 

 

五、Complex data types: Arrays and Collections

 Array、List Set、Map

当添加一个item时,编译器执行静态检查,确保只添加合适类型的item。因此,可确保取出的值是指定类型的。

Iterator as a mutable type 迭代器:迭代器是一个对象,它遍历一组元素并逐个返回元素。for(…:…)形式的遍历,调用的是被遍历对象所实现的迭代器。

六、Useful immutable types

基本类型及其封装对象类型都是不可变的。
这种包装器得到的结果是不可变的:只能看,但是这种“不可变”是在运行阶段获得的,编译阶段
无法据此进行静态检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值