如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks
          作者楊中科是CowNew開源團(tuán)隊(duì)JDBMonitor項(xiàng)目組的開發(fā)人員。
          CowNew開源團(tuán)隊(duì)網(wǎng)站 http://www.cownew.com
          論壇 http://www.cownew.com/newpeng/
          轉(zhuǎn)載請(qǐng)注明此版權(quán)信息

          我個(gè)人是極力反對(duì)不必要的downcasting的,但是在使用java的集合類的時(shí)候確是不可避免的,因?yàn)镴DK5之前的集合中只能存儲(chǔ)Object類型,所以看到一個(gè)List的時(shí)候,你也不知道里邊放的是什么數(shù)據(jù)類型,只能膽戰(zhàn)心驚的來下轉(zhuǎn)型:Integer i = (Integer)list.get(i)。
          好在JDK5可以使用泛型了,這個(gè)問題也就迎刃而解了。這樣就再也不會(huì)去去問其他開發(fā)人員“你List里放的是什么類型的對(duì)象?”,再也不會(huì)望著一大堆以“老祖先”形式表現(xiàn)的object了發(fā)呆了,終于可以看到容器中存的這些對(duì)象的類型了。
          但是在有的情況下我們還是不能使用JDK5的,比如你的正在開發(fā)的系統(tǒng)是基于JDK1.4的,那么遷移到JDK5是有一定風(fēng)險(xiǎn)的,或者你開發(fā)的模塊要被JDK5一下的程序使用的,那么就暫時(shí)放棄JDK5的這個(gè)新特性了。
          那么沒有泛型我們就沒法解決這個(gè)問題了嗎?非也!鳥槍!呵呵。
          一種方式是自己包裝一下List寫一個(gè)自己的專有數(shù)據(jù)類型的List,比如
          class IntegerList()
          {
          ?? private List list;
          ?? ......
          ?? public void add(Integer i)
          ?? {
          ???? list.add(i);
          ?? }
          ?? public Integer get(int i)
          ?? {
          ????? return (Integer)list.get(i);
          ?? }
          }
          這樣做的缺點(diǎn)就是對(duì)每個(gè)數(shù)據(jù)類型都要生成一個(gè)集合類,無疑加大了代碼量。
          另一種方式就是使用數(shù)組解決此問題,因?yàn)閿?shù)組中的數(shù)據(jù)類型是清晰的,比如Integer[] ia = new Integer[5];,一眼就可以看出其中存儲(chǔ)的是什么類型。
          最好用的數(shù)據(jù)庫監(jiān)控、日志工具JDBMonitor就是通過這種方式解決此問題的。JDBMonitor的二進(jìn)制jar包和源代碼都可以從 http://www.cownew.com 下載得到。
          打開com.cownew.JDBMonitor.jdbc.connect
          定位到:
          List lisList = configInfo.getListenerInfoList();
          DBListenerInfo[] dbListenerInfos = new DBListenerInfo[lisList.size()];
          for(int i=0,n=lisList.size();i<n;i++)
          {
          ??? DBListenerInfo lisInfo = (DBListenerInfo) lisList.get(i);
          ??? dbListenerInfos[i] = lisInfo;
          }????
          return new DBConnection(cn,dbListenerInfos);??
          程序把多個(gè)監(jiān)聽器對(duì)象信息DBListenerInfo拼轉(zhuǎn)成DBListenerInfo數(shù)組,然后傳遞給DBConnection。
          DBConnection接收到dbListenerInfos會(huì)把它轉(zhuǎn)發(fā)給DBLogger做為其構(gòu)造函數(shù)的參數(shù):
          private DBLogger(DBListenerInfo[] dbListenerInfos)
          這樣在DBLogger內(nèi)部就可以很清晰的知道dbListenerInfos中的數(shù)據(jù)類型了:
          for(int i=0,n=dbListenerInfos.length;i<n;i++)
          {
          ?? ...
          ?? DBListenerInfo info = dbListenerInfos[i];
          ?? ...
          }

          在系統(tǒng)的接口邊界處傳遞的數(shù)據(jù)類型非常明確,不會(huì)因?yàn)閭鬟f一個(gè)光禿禿的List而不知道其類型,然后膽戰(zhàn)心驚的進(jìn)行類型轉(zhuǎn)換了。
          因此我認(rèn)為在一個(gè)方法或者類的內(nèi)部可以采用List等進(jìn)行數(shù)據(jù)的處理,但是當(dāng)需要與外部(相對(duì)于類來說就是其他類,相對(duì)于方法來說就是其他方法)交換多個(gè)同構(gòu)對(duì)象的時(shí)候,最好轉(zhuǎn)換成數(shù)組傳遞,這樣就清晰多了。

          posted on 2006-06-02 23:41 CowNew開源團(tuán)隊(duì) 閱讀(745) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昭通市| 民丰县| 浦江县| 波密县| 霞浦县| 吕梁市| 阿拉善右旗| 涡阳县| 和政县| 柘荣县| 竹溪县| 建水县| 砚山县| 清河县| 宿松县| 镇江市| 灵石县| 平阴县| 嘉荫县| 买车| 兴业县| 无锡市| 鄂托克旗| 手机| 池州市| 庆阳市| 汉源县| 成武县| 观塘区| 中牟县| 甘洛县| 吉安县| 金塔县| 襄汾县| 兖州市| 商丘市| 洛宁县| 涪陵区| 和硕县| 襄垣县| 五家渠市|