Java访问权限
对于类:
public:可以被其他任何文件访问
package-private(默认):只能在这一个包中被访问
对于成员:
ADT是什么
抽象数据类型,包括抽象化(Abstraction)、模板化(Modularity)、封装性(Encapsulation)、信息隐藏性(Information hiding)、责任分离化(Separation of concerns),以达到减少bug、易于理解、易于修改的目的。关键点在于,我们定义的一个抽象数据类型,可以让用户并不关心数据是如何存储与表示的,而只需要关心这个数据的操作有哪些。换句话来说,一个抽象数据类型的操作标识了这个数据类型,如定义Person类存储一些信息,用户不需要知道它里面的数据的存储形式,但用户能操作这些数据,并达到自己的目的;再入list类,我们根据它的操作将它命名为list,而并不是它确实就是链表或者数组存储。
ADT的操作
一般来说一个抽象数据类型,如xd的操作分为四类,可由输入类型到输出类型的映射区分:
构造器(Creators):产生一个新的xd对象,some type -> xd
产生器(Producers):输入一个旧的xd对象,产生一个新的xd对象, xd -> xd
观察器(Observers):输出一个xd对象的某些特征, xd -> some type
改变器(Mutators):改变一个xd对象 ,xd (+ some type) -> void / some type / xd
下面是一些具体的例子,可以看到ADT在java中非常常见且有用
int
creators: the numeric literals 0, 1, 2, …
producers: arithmetic operators +, -, *, /
observers: comparison operators ==, !=, <, >
mutators: none (it’s immutable)
List
creators: ArrayList and LinkedList constructors, Collections.singletonList
producers: Collections.unmodifiableList
observers: size, get
mutators: add, remove, addAll, Collections.sort
String
creators: String constructors, valueOf static methods
producers: concat, substring, toUpperCase
observers: length, charAt
mutators: none (it’s immutable)
设计ADT的建议
1.定义多个简单的操作,而不是一个复杂的操作
2.定义操作不应过于狭窄,如list中定义sum操作相加其中元素,当list中元素为String时将不再适用
3.定义操作应全面,防止功能产生较大缺陷
4.不要混合泛型与确定类型
表示独立性(Representation independence)
一个ADT应该具有表示独立性,即此抽象类型的使用方式与实际数据存储形式是独立的。如不管是链表存储还是数组存储,List的操作在用户看来应该是不变的。
ADT的测试
可以看到ADT中的方法是相互关联的,如要测试观察器会用到构造器,所以允许循环检验。