關(guān)于Java雙大括號{{}}的具體使用
初看 cgaolei 翻譯的 Java技巧之雙括弧初始化 一文,走馬觀花,只知用法,未細看后面的解釋。蔚為驚艷,心里想 Java 竟然有這么神奇的語法而一直未得知。因為在初始化集合時確實方便不少。原來做某些測試要初始化集合時會用到 commons-lang 包和 JDK 的 Arrays 工具類,現(xiàn)在知道可以這么用了:
Map map =newHashMap() {{ put("Name","Unmi"); put("QQ","1125535"); }}; List stooges =newArrayList() {{ add("Larry"); add("Moe"); add("Curly");
看起來都是在一條語句里完成,而不需要分步驟寫成:
Map map =newHashMap(); map.put("Name","Unmi"); map.put("QQ","1125535");
一不小心沒好好理解的人可能以為它是什么特別的語法,關(guān)鍵是大括號連一塊了,原作者也是在故作姿態(tài),美其名曰:雙括弧語法(double-brace syntax)。真是亂花漸欲迷人眼,其實就是匿名類加初始塊。該文有解釋:***層括弧 實際是定義了一個內(nèi)部匿名類 (Anonymous Inner Class),第二層括弧 實際上是一個實例初始化塊 (instance initializer block),這個塊在內(nèi)部匿名類構(gòu)造時被執(zhí)行。
那怎么去更好理解它呢?如果我們寫成如下的方式應(yīng)該會更好理解吧,提個技巧,在 Eclipse 中對***段代碼按下 Ctrl + Shift + F 就如下了:
Map map =newHashMap() { { put("Name","Unmi"); put("QQ","1125535"); } }; ?
其實就是匿名類啊,會創(chuàng)建出一個 HashMap 的子類來,匿名類中一個 {} 括起來的初始化塊,里面自然可放置初始化代碼。{} 塊中的代碼編譯后會放到 (),也就是構(gòu)造方法中去,所以可用來初始化實例。如果是寫在 TestDoubleBrace 類中,編譯后你會看到會生成 TestDoubleBrace$1.class 文件,反編譯該文件內(nèi)容是:
finalclasscom.unmi.TestDoubleBrace$1extendsjava.util.HashMap{//創(chuàng)建了一個 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ī)范,才使得那么的令人費解。如果還不能理解,再列兩個慣用代碼來:
JFrame frame =newJFrame(); frame.addMouseListener(newMouseAdapter() { publicvoidmouseClicked(MouseEvent e) { // do womething here. } }); Thread thread =newThread() {{// 也學(xué)著樣把大括號也連一塊寫了 this.setName("作業(yè)處理線程"); }// 如果不重新定義 run() 方法,那么后面那個大括號也能與這個并一塊 publicvoidrun() { // do something here. }; thread.start();
應(yīng)該沒問題了吧,上面是事件監(jiān)聽器和多線程常用的寫法,如果他不把大括號連在一起,而是規(guī)范的寫代碼,相信您一開始也不會對所謂的 Double Brace Syntax 有太多的困惑。要說這種初始化方法運用到集合中還挺方便的,只是無端的多了些匿名類。
剛開始我看到這種Java雙括弧寫法也是把它奉若圣經(jīng),對它只一知半解,昨天在用 XStream 把一個對象生成 XML 文件時,其中有一個 List 屬性,我就借用了這種雙括符法來初始化元素,結(jié)果生成的 XML 文件走了樣,原因是 XStream 的 Converter 能處理 ArrayList,但無法很好的處理生成的 ArrayList 的匿名子類。因此才回頭認真的重新審視了一番這個所謂的雙括符初始化語法。
以上就是對Java雙括弧技巧的一些思考。本文來自隔葉黃鶯 The Blog of Unmi博客,原文名:《也說 Java 的雙括符初始化, 其實就是令人費解的不規(guī)范代碼》,更多相關(guān)Java雙大括號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA下lombok安裝及找不到get,set的問題的解決方法
這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04SpringBoot+Vue+Redis實現(xiàn)單點登錄(一處登錄另一處退出登錄)
小編接到一個需求,需要實現(xiàn)用戶在瀏覽器登錄后,跳轉(zhuǎn)到其他頁面,當用戶在其它地方又登錄時,前面用戶登錄的頁面退出登錄,這篇文章主要介紹了SpringBoot+Vue+Redis實現(xiàn)單點登錄,需要的朋友可以參考下2019-12-12SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法
這篇文章主要介紹了SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12查找native方法的本地實現(xiàn)函數(shù)native_function詳解
JDK開放給用戶的源碼中隨處可見Native方法,被Native關(guān)鍵字聲明的方法說明該方法不是以Java語言實現(xiàn)的,而是以本地語言實現(xiàn)的,Java可以直接拿來用。這里介紹下查找native方法的本地實現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧2021-12-12SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應(yīng)代碼示例
這篇文章主要給大家介紹了關(guān)于SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應(yīng)的相關(guān)資料,前端負責展示頁面和用戶交互,而后端則負責處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲,在這種架構(gòu)下前端需要將用戶輸入的數(shù)據(jù)發(fā)送給后端進行處理,需要的朋友可以參考下2023-12-12Java均攤復(fù)雜度和防止復(fù)雜度的震蕩原理分析
這篇文章主要介紹了Java均攤復(fù)雜度和防止復(fù)雜度的震蕩,結(jié)合實例形式分析了Java均攤復(fù)雜度和防止復(fù)雜度的震蕩相關(guān)概念、原理、實現(xiàn)方法與注意事項,需要的朋友可以參考下2020-03-03