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提示方法的时候可以更好的排序,将同一类方法排列在一起,方便查询。