<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-199  評(píng)論-203  文章-11  trackbacks-0

    原文地址:http://www.c2.com/cgi/wiki?DoubleBraceInitialization

            這是我在JavaIdioms(http://www.c2.com/cgi/wiki?JavaIdioms)上看到一個(gè)Java使用技巧。使用Java這么多年了,也還是頭一次看到,還很實(shí)用。別看這小技巧好像很簡(jiǎn)單,但保證你不會(huì)在任何一書(shū)Java教材上看到,因?yàn)樗皇且粋€(gè)真正的語(yǔ)法規(guī)范,而是一個(gè)語(yǔ)法的用法變種。小技巧還蘊(yùn)含著Java的深層知識(shí),就是身經(jīng)百戰(zhàn)的老手也不一定能說(shuō)出其中奧妙。

    翻譯正文:

    由于Java語(yǔ)言的集合框架中(collections, 如list, map, set等)沒(méi)有提供任何簡(jiǎn)便的語(yǔ)法結(jié)構(gòu),這使得在建立常量集合時(shí)的工作非常繁索。每次建立時(shí)我們都要做:

    1. 定義一個(gè)臨時(shí)的集合類變量
    2. 建立一個(gè)空集合的實(shí)例,然后賦值給變量
    3. 將數(shù)據(jù)放入集合中
    4. 最后將集合做為參數(shù)傳遞給方法

    例如,要將一個(gè)Set變量傳給一個(gè)方法:

    Java代碼 復(fù)制代碼
    1. Set<String> validCodes = new HashSet<String>();   
    2. validCodes.add("XZ13s");   
    3. validCodes.add("AB21/X");   
    4. validCodes.add("YYLEX");   
    5. validCodes.add("AR2D");   
    6. removeProductsWithCodeIn(validCodes);  

    也可以用靜態(tài)初始的方法

    Java代碼 復(fù)制代碼
    1. private static final Set<String> validCodes = new HashSet<String>();   
    2. static {   
    3.        validCodes.add("XZ13s");   
    4.        validCodes.add("AB21/X");   
    5.        validCodes.add("YYLEX");   
    6.        validCodes.add("AR2D");   
    7. }  

    其實(shí),還有簡(jiǎn)結(jié)的方法,我們可以用雙括弧語(yǔ)法(double-brace syntax)建立并初始化一個(gè)新的集合:

    Java代碼 復(fù)制代碼
    1. private static final Set<String> VALID_CODES = new HashSet<String>() {{   
    2.        add("XZ13s");   
    3.        add("AB21/X");   
    4.        add("YYLEX");   
    5.        add("AR2D");   
    6. }};  

    或者

    Java代碼 復(fù)制代碼
    1. removeProductsWithCodeIn(new HashSet<String>() {{   
    2.        add("XZ13s");   
    3.        add("AB21/X");   
    4.        add("YYLEX");   
    5.        add("AR5E");   
    6. }});  

    第一層括弧 實(shí)際是定義了一個(gè)內(nèi)部匿名類 (Anonymous Inner Class),第二層括弧 實(shí)際上是一個(gè)實(shí)例初始化塊 (instance initializer block),這個(gè)塊在內(nèi)部匿名類構(gòu)造時(shí)被執(zhí)行。這個(gè)塊之所以被叫做“實(shí)例初始化塊”是因?yàn)樗鼈儽欢x在了一個(gè)類的實(shí)例范圍內(nèi)。這和“靜態(tài)初始化塊 (static initialzer)”不同,因?yàn)檫@種塊在定義時(shí)在括弧前使用了static關(guān)鍵字,因此它的和類在同一個(gè)范圍內(nèi)的,也就是說(shuō)當(dāng)類加載時(shí)就會(huì)被執(zhí)行(更詳情,可參考Java語(yǔ)言規(guī)范http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 )。實(shí)例初始化塊中可以使用其容器范圍內(nèi)的所有方法及變量,但特別需要注意的是實(shí)例初始化塊是在構(gòu)造器之前運(yùn)行的。


    這種方法只適用于不是final的類,因?yàn)閒inal類是無(wú)法建立內(nèi)部匿名子類,好在集合類都沒(méi)有這個(gè)限制。因此,這種方法還可以被用來(lái)初始化其它任何對(duì)象,比如一個(gè)GUI對(duì)象:

    Java代碼 復(fù)制代碼
    1. add(new JPanel() {{   
    2.        setLayout(...);   
    3.        setBorder(...);   
    4.        add(new JLabel(...));   
    5.        add(new JSpinner(...));   
    6. }});  

     這樣建立的內(nèi)部匿名類的實(shí)例中包函它容器對(duì)像的引用。如果串行化(serialization)這個(gè)集合同時(shí)也會(huì)串行化它的內(nèi)部類.

    posted on 2009-07-14 16:47 Werther 閱讀(1793) 評(píng)論(4)  編輯  收藏 所屬分類: 10.Java

    評(píng)論:
    # re: Java技巧之雙括弧初始化 2009-07-14 19:21 | 日月雨林@gmail.com
    這個(gè)方法我經(jīng)常用! 很早就開(kāi)始用了!  回復(fù)  更多評(píng)論
      
    # re: Java技巧之雙括弧初始化 2009-07-14 21:40 | ecbeta
    說(shuō)實(shí)話理解不是問(wèn)題. 只是沒(méi)有想到這樣用. 匿名內(nèi)部類經(jīng)常使用. 但是沒(méi)有想到有這樣的用法. 這樣可以推廣到任何一種類了 除非那種final的.  回復(fù)  更多評(píng)論
      
    # re: Java技巧之雙括弧初始化 2009-07-15 10:47 | 于翔
    見(jiàn)識(shí)了  回復(fù)  更多評(píng)論
      
    # re: Java技巧之雙括弧初始化 2013-08-12 16:40 | dohkoos
    Initializer Build idiom。  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 九九美女网站免费| 好猛好深好爽好硬免费视频| 外国成人网在线观看免费视频| 亚洲Av无码乱码在线znlu| 日韩欧美亚洲中文乱码| 国产精品免费看香蕉| 亚洲AV噜噜一区二区三区| 日日操夜夜操免费视频| 亚洲大尺度无码无码专线一区| 在线观看免费大黄网站| 亚洲AV无码一区二区三区性色| 在线免费观看毛片网站| 小说专区亚洲春色校园| 亚洲成a人在线看天堂无码| 一级毛片aa高清免费观看| 精品亚洲一区二区三区在线观看| 日韩电影免费在线观看网站| 国产亚洲精品自在线观看| A国产一区二区免费入口| 国产精品亚洲一区二区三区在线| 精品国产福利尤物免费| 久久精品亚洲视频| 1000部拍拍拍18勿入免费视频软件 | 亚洲不卡中文字幕无码| av永久免费网站在线观看| 1区1区3区4区产品亚洲| 一个人看www在线高清免费看| 亚洲中文无码卡通动漫野外| 四虎永久在线精品免费影视 | 亚洲av极品无码专区在线观看| 一个人看的www在线观看免费| 日韩亚洲翔田千里在线| 国产亚洲情侣一区二区无| 毛片无码免费无码播放| 好吊妞视频免费视频| 一区二区3区免费视频| 亚洲电影国产一区| 日韩免费毛片视频| 野花香高清在线观看视频播放免费| 亚洲国产精品午夜电影| 亚洲国产黄在线观看|