Abstract Data Type (ADT)

Types in Java
在这里插入图片描述
Immutability不变性

  • 不变性是一种主要的设计原则
  • 不变数据类型创建完后,值不可修改
  • 不变引用,一旦指定引用位置,不可再次指定
  • 使用final声明变量,则该变量是不可变得 。例,final int n = 5;
  • Final关键 字对不可变引用提供了静态检查的支持
  • 利用final来声明方 法的参数和局部变量。
  • 有利于代码理解和编译器的静态检查
  • final class 意味着它不能被继承。
  • final variable 表示它始终包含相同的值/引用,但不能更改
  • final method 意味着它不能被子类覆盖

Snapshot Diagram
Primitive and Object values in Snapshot Diagram
Primitive values基本数据类型的值由裸常量表示。传入箭头是对变量或对象字段的值的引用。
在这里插入图片描述
Object values对象值是按其类型标记的。当我们想要显示更多的细节时,我们在其中写入字段名,并用箭头指向它们的值。对于更详细的信息,字段可以包括它们声明的类型。有些人喜欢写x:int而不是int x,但两者都可以
在这里插入图片描述
Reassignment
例如,如果我们有一个字符串变量s,我们可以将它从值“a”重新赋值为“ab”
String s = “a”;
s = s + “b”;
String是不可变类型的一个例子,这种类型的值一旦创建就永远不会更改
s = s + “b”; 新生成的s,其地址空间发生改变,所以与创建的s的地址空间是不同的

Immutable objects (由它们的设计者设计,以始终表示相同的值)在快照图中由双边框表示,就像图中的字符串对象一样
在这里插入图片描述
Mutable values
相比之下,StringBuilder(一个内置的Java类)是一个可变的对象,它表示一个字符串字符,并且它具有更改对象值的方法
StringBuilder sb = new StringBuilder(“a”);
sb.append(“b”);
这两个快照图看起来非常不同,这很好“:可变性和不可变性之间的区别将在确保代码不受bug影响方面发挥重要作用在这里插入图片描述
Immutable references
Java还为我们提供了不可变的引用:只分配一次且从不重新分配的变量。要使引用不可变,请使用关键字final声明它
final int n = 5;
如果Java编译器不相信您的最终变量只会在运行时分配一次,那么它将产生编译器错误。因此final为不可变引用提供了一个静态检查。
▪在快照图中,不可变引用(final)用双箭头表示

在这里插入图片描述
这里有一个对象,它的id从未更改(不能将其重新分配到不同的数字),但是它的年龄可以更改

  • final StringBuilder sb:指向可变值的不可变引用( 引用不可变,值可变)
  • String s:指向不可变值的可变引用(值 不可变,引用可变)

Array
int[] a = new int[100];

List
List list = new ArrayList();

Some of its operations:
– indexing: list.get(2)
– assignment: list.set(2, 0)
– length: list.size()
在这里插入图片描述
Iterating
▪ Iterating an array
int max = 0;
for (int i=0; i<array.length; i++) {
max = Math.max(array[i], max);
}
▪ Iterating a List int max = 0;
for (int x : list) {
max = Math.max(x, max);
}

Set
– s1.contains(e) test if the set contains an element
– s1.containsAll(s2)test whether s1 ⊇ s2
– s1.removeAll(s2) remove s2 from s1
在这里插入图片描述
Map
A Map is similar to a dictionary (key-value) 键-值
– map.put(key, val) add the mapping key → val
– map.get(key) get the value for a key
– map.containsKey(key) test whether the map has a key
– map.remove(key) delete a mapping
在这里插入图片描述

Snapshot diagram of MyIterator
在这里插入图片描述
在这里插入图片描述

Data Abstraction数据抽象:
·一个类型的特征由可对其执行的操作刻画
·抽象类型的新颖性和以往不同之处在于对操作的关 注

对抽象类型的操作进行分类
Creator:产生类型的新对象
创建器可以将对象作为参数,但不能接受正在构造的类型的对象
Producers:在已有对象 基础上产生新的对象
例如,String的concat()方法是一个生成器:它接受两个字符串并生成一个表示它们连接的新字符串
Observers: 输入抽象类型的对象,返回其他类型的对象
例如,List的size()方法返回一个int
Mutators: 改变对象
例如,List的add()方法通过在列表末尾添加元素来修改列表
每每个T都是抽象类型本身个T都是抽象类型本身每个T都是抽象类型本身在这里插入图片描述
说明:
·每个T都是抽象类型本身
·每个t都是另一种类型
·+标记表示该类型可能在签名的该部分出现一次或多次
·*标记表示它出现0次或多次
·|表示or

Signature of a creator
·创建者要么作为构造函数实现,如new ArrayList(),要么作为静态方法实现,如Arrays.asList()
·作为静态方法实现的创建者通常称为工厂方法
·各种String.valueOf()(返回参数的字符串形式)在Java方法的其他例子创造者作为工厂方法实现

Signature of a mutator
·通常由空返回类型发出信号
·必须调用返回void的方法以获得某种副作用,因为否则它不会返回任何东西
·但并不是所有的改变者都返回void:
1.例如,set .add()返回一个布尔值,该布尔值指示是否实际更改了集合
2.在Java图形用户界面工具包中,Component.add()返回对象本身,以便多个add()调用可以链接在一起

Abstract Data Type Examples
int
在这里插入图片描述
Abstraction Function (AF)抽象函数
·将代表值映射到它们所表示的抽象值的抽象函数
在这里插入图片描述
·图中的弧表示抽象函数
·在函数术语中,属性可以表示为:函数是满射的(也称为上射),不一定是单射的(一对一),因此不一定是双射的,而且常常是偏的。(AF是满射的、未必单射、未必双射)
在这里插入图片描述
Rep Invariant(RI)
·RI告诉我们空间R中的r是否被AF映射到了空间A中的某个值
·RI形成了空间R的一个子集(子集中的 所有元素均被AF映射到了空间A中)

Documenting RI and AF
·代表不变式和抽象函数都应该在代码中进行文档化,就在代表本身的声明旁边

What determine AF and RI?
·AF 和 RI 既不由选定的表示值空间决定,也不由抽象值空间单独决定
·表示值空间确定后,AF和RI也不是确定的
· 即使相同的表示值空间和相同的表示不变性RI,我们仍然可以用不同的抽象函数AF来映射

How RI and AF influence ADT design
·ADT设计的关键:不仅是选择两个空间(面向规格说明的抽 象值空间和面向实现的表示值空间), 而且要决定表示值(RI)和如何映射(AF)。

Checking the Rep Invariant
· 在实现中采用断言技术来检查不变性是否保持,可 以更早地捕获bug
· 应 该在所有有create和mutate作用类型方法的最后检查不变性
·即使在注释中进行了 阐述,也要在checkRep中检查

Beneficent mutation
·抽象值永远不可改变
·在确保其映射的抽象值不变前提下,表示值可 以变化
·AF是多对一的映射,rep value改变为了“多”中的另外一个

Documenting the AF, RI, and Safety from Rep Exposure
Documenting AF and RI
·在类中说明AF、RI、不变性,在定义Rep的 位置
·对表示泄露安全相关的参数,特别是输入参数和返回值,给 出保证不泄露内部表示的策略

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值