抽象数据类型(ADT)
一些名词
抽象:忽略底层细节而在高层思考。
信息隐藏:将模块的实现细节隐藏,使未来更改模块内部时不必改变外部代码。
类型和操作的分类
对于类型(不管是内置的还是用户自定义的)都可以被分为mutable和immutable两种类型,mutable类型的对象能够被改变,它们提供了改变对象内容的操作。String是immutable的,StringBuilder是mutable的。
抽象类型的操作符可被分成四类:
-
creator:创建一个该类型的新对象。一个创建者可能会接受一个对象作为参数,但是这个对象的类型不能是它创建对象对应的类型。一个creator通常是由构造函数实现的(例如new ArrayList(),但是有的构造体是静态方法(类方法),例如 Arrays.asList(),String.valueOf()和List.of()等 ,这样的静态方法也称为factory method。)
-
producer:通过接受同类型的对象创建新的对象。例如, String类里面的 concat 方法就是一个producer,它接受两个字符串然后据此产生一个新的字符串。
-
observer:接受一个同类型的对象然后返回一个不同类型的对象/值。例如List的 size 方法,它返回一个 int。
-
mutator:改变对象的内容。例如 List的 add 方法,它会在列表中添加一个元素。
我们可以将这种区别用映射表示:
抽象数据类型的例子
int 是Java中的原始整数类型,它是不可变类型,没有mutator。
creators: 字面量 0, 1, 2, …
producers: 算术符 +, -, *, /
observers: 比较符号 ==, !=, <, >
mutators: 无
List 是Java中的列表类型,它是可更改类型。另外,List也是一个接口,所以对于它的实现可以有很多类,例如 ArrayList 和 LinkedList.
creators: ArrayList 和 LinkedList 构造函数
producers: Collections.unmodifiableList
observers: size, get
mutators: add, remove, addAll, Collections.sort
String 是Java中的字符串类型,它是不可变类型。
creators: String 构造函数, valueOf 静态方法(工厂方法)
producers: concat, substring, toUpperCase
observers: length, charAt
mutators: 无
Integer.valueOf()——creator(将基本类型int转换为包装类型Integer,或者将String转换成Integer)
BigInteger.mod()——producer
List.addAll()——mutator
String.toUpperCase()——producer
Set.contains()——observer
Map.keySet()——observer
BufferedReader.readLine()——mutator(读入操作会修改内部指针指向,所以是mutator)
对于复杂的数据类型,有些操作可能既是producer也是mutator。