隨筆 - 17  文章 - 49  trackbacks - 0
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(17)

          相冊

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          ?

          道虎紋: 參數 機制

          ?

          管中窺虎

          在學習 java 1.5 的過程中,我使用了 sun 公布的 tutorial ,這份文檔寫的比較詳盡易明,但是對于想快速了解 tiger 而且具有較好 java 基礎的人來說,大篇幅的英文文檔是比較耗時間和非必需的,所以我將會歸納這份文檔的主要內容,在保證理解的底線上,盡力減少閱讀者需要的時間。

          ?

          在以下地址可以進入各新增語言特色介紹以及下載相關文檔(若有)。

          http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

          ?

          2006 8 17 星期四

          Varargs

          (理解為 var-args 可變參數)

          在以前的版本里,一個接納多個參數的方法,在調用前就需要用創建一個數組來放入這些參數,例如:

          Object[]?arguments? = ?{

          ????
          new ?Integer( 7 ),

          ????
          new ?Date(),

          ????
          " a?disturbance?in?the?Force "

          };

          ?

          String?result?
          = ?MessageFormat.format(

          ????
          " At?{1,time}?on?{1,date},?there?was?{2}?on?planet? "

          ?????
          + ? " {0,number,integer}. " ,?arguments);

          現在依然必須這么傳遞,但varargs自動化并隱藏了這些步驟,而且還與已有的API兼容。之前的那個例子里,MessageFormat.format現在有了這樣的聲明:

          public ? static ?String?format(String?pattern,

          ????????????????????????????????Object?arguments);

          在最后一個參數的類型后面的那三個句號,說明了這個參數可以傳入一個數組或者一串參數。注意只能是最后那個參數才能有這種用法。現在這個方法可以這樣引用:

          String?result? = ?MessageFormat.format(

          ????
          " At?{1,time}?on?{1,date},?there?was?{2}?on?planet? "

          ????
          + ? " {0,number,integer}. " ,

          ????
          7 ,? new ?Date(),? " a?disturbance?in?the?Force " );

          ?

          Autoboxing varargs有著很強的配合關系,看看下面這些代碼:

          ?

          // ?Simple?test?framework

          public ? class ?Test? {

          ????
          public ? static ? void ?main(String[]?args)? {

          ????????
          int ?passed? = ? 0 ;

          ????????
          int ?failed? = ? 0 ;

          ????????
          for ?(String?className?:?args)? {

          ????????????
          try ? {

          ????????????????Class?c?
          = ?Class.forName(className);

          ????????????????c.getMethod(
          " test " ).invoke(c.newInstance());

          ????????????????passed
          ++ ;

          ????????????}
          ? catch ?(Exception?ex)? {

          ????????????????System.out.printf(
          " %s?failed:?%s%n " ,?className,?ex);

          ????????????????failed
          ++ ;

          ????????????}


          ????????}


          ????????System.out.printf(
          " passed=%d;?failed=%d%n " ,?passed,?failed);

          ????}


          }


          ?

          這個小程序可能是最小型的完整的測試框架了。getMethodprintf方法由于varargs的緣故而不需要聲明數組來傳參了。代碼比以前會清潔很多。

          什么時候該用?作為客戶端的話大可以好好利用,只要api里有提供,事實上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作為api的設計者,則應該謹慎地使用,只有你感覺到很有效果的時候才采取。總的來說,不要重載帶varargs的方法,否則客戶端程序員會很困惑哪個方法是被調用了。

          posted on 2006-08-17 18:09 Ye Yiliang 閱讀(1175) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 北海市| 武乡县| 大冶市| 上思县| 静乐县| 东阿县| 罗江县| 东安县| 桐梓县| 项城市| 潮安县| 江北区| 梧州市| 汶上县| 台东市| 临沧市| 瑞金市| 临西县| 镇宁| 涟源市| 正定县| 攀枝花市| 嫩江县| 略阳县| 新昌县| 西充县| 台湾省| 定兴县| 平阳县| 雷波县| 佛坪县| 礼泉县| 天祝| 香港| 金坛市| 泰安市| 望江县| 时尚| 陵水| 平乐县| 柘荣县|