### 设计优秀API的五大规则
规则1:建立强有力的专业术语
随着API的不断增长,这些专业术语会被重复使用。例如,这些行为会导致各种类/类型/方法(classes/types/methods)产生不同微妙的行为。
事实上,他们看起来很相似,需要通过命名来区分。以JDBC为例,无论你执行哪条语句,你都需要使用它们来执行。比如,你可以调用这些方法:
~~~
execute(String)
executeBatch()
executeQuery(String)
executeUpdate(String)
~~~
与之类似,无论你发布哪些资源,你都经常使用一些术语,比如,你会调用:
~~~
Connection.close()
Statement.close()
ResultSet.close()
~~~
事实上,close在JDK中是一款强大的且已被确立的专业术语,这就导致java.io.Closeable (since Java 1.5)与java.lang.AutoCloseable (since Java 1.7)接口建立了释放资源约定。
该类声明
~~~
countObservers()
deleteObserver(Observer)
deleteObservers()
~~~
同样适用于Observer.update(),实则应称为notify(),JDK API里的另一个术语。
规则2:在组合上运用对称的命名方式
一旦你创建强有力的条款,你会开始将他们结合起来。当你看到JDK收集APIS,你会注意到它们以对称的方式创建条款add()、remove()、contains()等等,在将其结合之前:
~~~
add(E)
addAll(Collection<? extends E>)
remove(Object)
removeAll(Collection<?>)
contains(Object)
containsAll(Collection<?>)
~~~
规则3:使用重载
人们之所以使用方法重载,主要是因为它给程序带来了许多方便。你经常希望在不同的地方做相同的事情,但每次去构造方法又很繁琐,那怎么办?你只需为API用户在相同的方法里提供额外的变量,并且把参数类型设置成友好型(friend)。下面以Collection为例:
~~~
toArray()
toArray(T[])
~~~
另外一个是Arrays utility类:
~~~
copyOf(T[], int)
copyOf(boolean[], int)
copyOf(int[], int)
~~~
使用重载的两大原因:
1. 提供“default”参数行为,正如Collection.toArray()
2. 支持一些不兼容的“相似”参数设置,如 Arrays.copyOf()
规则4:参数顺序一致
为了确保参数顺序的一致性,把数组类型放在第一位会给你带来很多好处:
~~~
copyOf(T[], int)
copyOf(boolean[], int)
copyOf(int[], int)
~~~
你会注意到,在上面那个类中,把所有数组操作都放在第一位