這篇文章將為大家詳細(xì)講解有關(guān)Java雙括弧使用技巧是什么,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有長(zhǎng)白免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Java雙括弧技巧回顧
初看 cgaolei 翻譯的 Java技巧之雙括弧初始化 一文,走馬觀花,只知用法,未細(xì)看后面的解釋。蔚為驚艷,心里想 Java 竟然有這么神奇的語法而一直未得知。因?yàn)樵诔跏蓟蠒r(shí)確實(shí)方便不少。原來做某些測(cè)試要初始化集合時(shí)會(huì)用到 commons-lang 包和 JDK 的 Arrays 工具類,現(xiàn)在知道可以這么用了:
Map map = new HashMap() {{ put("Name", "Unmi"); put("QQ", "1125535"); }}; List stooges = new ArrayList() {{ add("Larry"); add("Moe"); add("Curly"); }};
看起來都是在一條語句里完成,而不需要分步驟寫成:
Map map = new HashMap(); map.put("Name","Unmi"); map.put("QQ","1125535");
一不小心沒好好理解的人可能以為它是什么特別的語法,關(guān)鍵是大括號(hào)連一塊了,原作者也是在故作姿態(tài),美其名曰:雙括弧語法(double-brace syntax)。真是亂花漸欲迷人眼,其實(shí)就是匿名類加初始?jí)K。該文有解釋:***層括弧 實(shí)際是定義了一個(gè)內(nèi)部匿名類 (Anonymous Inner Class),第二層括弧 實(shí)際上是一個(gè)實(shí)例初始化塊 (instance initializer block),這個(gè)塊在內(nèi)部匿名類構(gòu)造時(shí)被執(zhí)行。
那怎么去更好理解它呢?如果我們寫成如下的方式應(yīng)該會(huì)更好理解吧,提個(gè)技巧,在 Eclipse 中對(duì)***段代碼按下 Ctrl + Shift + F 就如下了:
Map map = new HashMap() { { put("Name", "Unmi"); put("QQ", "1125535"); } };
其實(shí)就是匿名類啊,會(huì)創(chuàng)建出一個(gè) HashMap 的子類來,匿名類中一個(gè) {} 括起來的初始化塊,里面自然可放置初始化代碼。{} 塊中的代碼編譯后會(huì)放到
final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //創(chuàng)建了一個(gè) HashMap 的子類 TestDoubleBracke$1 com.unmi.TestDoubleBrace$1(); Code: 0: aload_0 1: invokespecial #8; //Method java/util/HashMap."":()V //{} 中的代碼放到了構(gòu)造方法中去了 4: aload_0 5: ldc #10; //String Name 7: ldc #12; //String Unmi 9: invokevirtual #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 12: pop 13: aload_0 14: ldc #18; //String QQ 16: ldc #20; //String 1125535 18: invokevirtual #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 21: pop 22: return }
所以說白了,什么雙括弧語法啊,就是代碼寫得不規(guī)范,才使得那么的令人費(fèi)解。如果還不能理解,再列兩個(gè)慣用代碼來:
JFrame frame = new JFrame(); frame.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // do womething here. } }); Thread thread = new Thread() {{ // 也學(xué)著樣把大括號(hào)也連一塊寫了 this.setName("作業(yè)處理線程"); }// 如果不重新定義 run() 方法,那么后面那個(gè)大括號(hào)也能與這個(gè)并一塊 public void run() { // do something here. } }; thread.start();
應(yīng)該沒問題了吧,上面是事件監(jiān)聽器和多線程常用的寫法,如果他不把大括號(hào)連在一起,而是規(guī)范的寫代碼,相信您一開始也不會(huì)對(duì)所謂的 Double Brace Syntax 有太多的困惑。要說這種初始化方法運(yùn)用到集合中還挺方便的,只是無端的多了些匿名類。
剛開始我看到這種Java雙括弧寫法也是把它奉若圣經(jīng),對(duì)它只一知半解,昨天在用 XStream 把一個(gè)對(duì)象生成 XML 文件時(shí),其中有一個(gè) List 屬性,我就借用了這種雙括符法來初始化元素,結(jié)果生成的 XML 文件走了樣,原因是 XStream 的 Converter 能處理 ArrayList,但無法很好的處理生成的 ArrayList 的匿名子類。因此才回頭認(rèn)真的重新審視了一番這個(gè)所謂的雙括符初始化語法。
關(guān)于“Java雙括弧使用技巧是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。