天天看點

commons-pool2源碼分析-ObjectPool接口函數定義思考擴充

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異常。

commons-pool2源碼分析-ObjectPool接口函數定義思考擴充

廢棄對象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提示方法的時候可以更好的排序,将同一類方法排列在一起,友善查詢。