作者杨中科是CowNew开源团队JDBMonitor项目组的开发人员 CowNew开源团队网站 论坛 转载请注明此版权信息 我个人是极力反对不必要的downcasting的但是在使用java的集合类的时候确是不可避免的因为JDK之前的集合中只能存储Object类型所以看到一个List的时候你也不知道里边放的是什么数据类型只能胆战心惊的来下转型Integeri=(Integer)listget(i) 好在JDK可以使用泛型了这个问题也就迎刃而解了这样就再也不会去去问其他开发人员你List里放的是什么类型的对象?再也不会望着一大堆以老祖先形式表现的object了发呆了终于可以看到容器中存的这些对象的类型了 但是在有的情况下我们还是不能使用JDK的比如你的正在开发的系统是基于JDK的那么迁移到JDK是有一定风险的或者你开发的模块要被JDK一下的程序使用的那么就暂时放弃JDK的这个新特性了 那么没有泛型我们就没法解决这个问题了吗?非也!鸟枪!呵呵 一种方式是自己包装一下List写一个自己的专有数据类型的List比如 classIntegerList() { privateListlist;
publicvoidadd(Integeri) { listadd(i); } publicIntegerget(inti) { return(Integer)listget(i); } } 这样做的缺点就是对每个数据类型都要生成一个集合类无疑加大了代码量 另一种方式就是使用数组解决此问题因为数组中的数据类型是清晰的比如Integer[]ia=newInteger[];一眼就可以看出其中存储的是什么类型 最好用的数据库监控日志工具JDBMonitor就是通过这种方式解决此问题的JDBMonitor的二进制jar包和源代码都可以从;下载得到 打开wnewnnect 定位到 ListlisList=configInfogetListenerInfoList(); DBListenerInfo[]dbListenerInfos=newDBListenerInfo[lisListsize()]; for(inti=n=lisListsize();i<n;i++) { DBListenerInfolisInfo=(DBListenerInfo)lisListget(i); dbListenerInfos[i]=lisInfo; } returnnewDBConnection(cndbListenerInfos); 程序把多个监听器对象信息DBListenerInfo拼转成DBListenerInfo数组然后传递给DBConnection DBConnection接收到dbListenerInfos会把它转发给DBLogger做为其构造函数的参数 privateDBLogger(DBListenerInfo[]dbListenerInfos) 这样在DBLogger内部就可以很清晰的知道dbListenerInfos中的数据类型了 for(inti=n=dbListenerInfoslength;i<n;i++) {
DBListenerInfoinfo=dbListenerInfos[i];
} 在系统的接口边界处传递的数据类型非常明确不会因为传递一个光秃秃的List而不知道其类型然后胆战心惊的进行类型转换了 因此我认为在一个方法或者类的内部可以采用List等进行数据的处理但是当需要与外部(相对于类来说就是其他类相对于方法来说就是其他方法)交换多个同构对象的时候最好转换成数组传递这样就清晰多了 |