Abstract Data Type (ADT)

本文围绕Java中的类型展开,介绍了不变性,包括不变数据类型、不变引用及final关键字的使用。阐述了快照图中基本数据类型和对象值的表示,以及可变性与不可变性的区别。还讲解了数组、列表、集合、映射等数据结构,重点介绍了数据抽象、抽象函数、表示不变式及其对ADT设计的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的 位置
·对表示泄露安全相关的参数,特别是输入参数和返回值,给 出保证不泄露内部表示的策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值