一、Java泛型
Apache Commons Pool2源码中用到了很多泛型的知识,这里我们回顾一下泛型,以便于我们更好的阅读后续的源码。
1. 什么是泛型?
简而言之,泛型可以在定义类,接口和方法时使类型(类和接口)成为参数。类似在方法声明中使用的形式参数。
2. Java泛型标记符
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的Java类型
- S、U、V - 2nd、3rd、4th types
3. Object与这些标记符代表的Java类型有啥区别呢?
Object是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。
4. 官方参考
可以肯定的说,上面介绍的知识,在论坛和博客中都可以搜索到,但是大家有没有想过,那些发布博客的人从哪里获取这些泛型的知识呢?书是一个渠道,更重要的是官方的文档参考,如果英文不错我强烈建议大家看官网的原版说明,从这些官方的技术文档中,你可以获得很多意想不到的知识。http://docs.oracle.com/javase/tutorial/java/generics/index.html这个地址是Oracle官网关于Java泛型的说明,建议大家有空阅读阅读。
二、初识Pool2
回顾了Java泛型,我们来认识一下Apache Commons Pool2吧,既然是先认识一下,与了解一个人是一样的,就是多接触,自然就会加深印象。对于代码我们怎么接触呢?那自然是demo了,一个小小的demo可以帮助我们了解,加深印象。我们来拆解一下Pool2的demo吧。
1. 准备demo环境
2. 从池中拿到StringBuffer,用完后放回池中
PS:一般情况下第14行代码,需要初始化一个buf=new StringBuffer(),而这里赋值为null,在第16行处直接从pool中获取StringBuffer,不再初始化,使用完毕后在第29行放回pool,这里把StringBuffer当成pool中的一种资源来使用,当然现实中使用StringBuffer直接初始化即可,不需要使用pool,可以展开想象,如果把StringBuffer换成jdbc连接,那不就是jdbc连接池了吗?
3. 定义StringBufferFactory,根据需要覆盖池中对象的生命周期方法
PS:PooledObjectFactory接口定义了池中对象的生命周期方法。 实现PoolableObjectFactory的最简单的方法是扩展BasePooledObjectFactory。StringBufferFactory是一个BasePooledObjectFactory实现,用来创建如上要用的StringBuffer对象。
4. 结合并测试
PS:我们传递StringBufferFactory给GenericObjectPool这个工厂来实例化我们的ReaderUtil。
从这个简单的demo可知,Pool2充当资源池,来管理StringBuffer这种对象资源。
【本文为51CTO专栏作者“朱国立”的原创稿件,转载请通过作者微信公众号“开发者圆桌”获取联系和授权】