ObjectPool是一個簡單的對象池定義接口。接口的應用也很簡單:
Object obj = null;
try {
obj = pool.borrowObject();
try {
//...use the object...
} catch(Exception e) {
// invalidate the object
pool.invalidateObject(obj);
// do not return the object to the pool twice
obj = null;
} finally {
// make sure the object is returned to the pool
if(null != obj) {
pool.returnObject(obj);
}
}
} catch(Exception e) {
// failed to borrow an object
}
函數定義
ObjectPool接口内定義了八個函數,最重要的是上面使用的借出、廢棄和歸還這個三個函數。
借出對象borrowObject()方法:從對象池擷取對象執行個體,借出的對象執行個體必須歸還,是以借和還的方法必須成對出現。借出方法定義抛出三類異常:第一種異常是内部建立對象過程的中出現問題,抛出Exception異常;第二種異常是借出方法别調用之前,對象池已經被關閉,抛出IllegalStateException狀态異常;第三種異常是對象池已經耗盡,沒有對象可被借出的NoSuchElementException元素不存儲異常。這三類異常都是JDK提供的異常類。
歸還對象returnObject(T obj)方法:歸還的對象obj必須是通過borrowObject()方法或相關方法借出的,否則方法會抛出IllegalStateException,如果歸還的對象執行個體不是被借出狀态(借出狀态參考狀态機),方法同樣會抛出IllegalStateException異常。如果歸還失敗方法抛出Exception異常。
廢棄對象invalidateObject(T obj)方法:對象廢棄的決定權在用戶端,借出的對象在使用過程中出現問題,用戶端代碼調用該方法将其歸還并廢棄。這裡的obj對象必須是通過borrowObject()方法借出的對象,廢棄失敗方法會抛出Exception異常。
新增空閑對象addObject()方法:方法沒有參數,是指對象池負責對象執行個體的建立,并将對象存放至空閑對象隊列中。該方法的主要重要之一就是實作對象執行個體預加載,在對象使用之前,送出建立一些對象執行個體,預存在對象池中。對象執行個體建立錯誤,會抛出Exception異常。對象執行個體建立之前,如果對象池已經關閉,會抛出IllegalStateException異常。如果對象池的實作類不支援外部觸發對象建立,方法應該抛出UnsupportedOperationException異常。
getNumIdle():傳回對象池中空閑對象數量。
getNumActive():傳回已被借出對象數量。
clear():清除空閑對象,釋放資源。實作類不支援該方法需要抛出UnsupportedOperationException異常。清除過程出現異常抛出Excetpion異常。
close():關閉資源池,并且是否所有資源,一定對象池被關閉,借出方法和新增對象方法的調用會抛出非法狀态異常。
思考擴充
1.一個資源池對象應該定義哪些方法?
在定義一個對象時,應該考慮清楚對象的職責。對象資源池ObjectPool定義了三類方法:對象管理類方法(borrowObject,returnObject,invalidateObject)、資源統計類方法(getNumIdle, getNumActive)、自身管理類方法(clear,close)。通過對象職責的細分定義不同類别的方法,可以更好的思考對象應該具備的職責。
2.對象數量方法的命名
getNumIdle()和getNumActive()兩個方法的命名好像不太符合文法習慣,我們更多的定義方式為getIdelNum()和getActiveNum()。“getNumActive()”可以分解為get num of active,”of”可以省略掉。這樣定有一個好處,就是在IDE提示方法的時候可以更好的排序,将同一類方法排列在一起,友善查詢。