91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java雙括弧使用技巧是什么

發布時間:2022-01-05 16:02:54 來源:億速云 閱讀:187 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Java雙括弧使用技巧是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Java雙括弧技巧回顧

初看 cgaolei 翻譯的 Java技巧之雙括弧初始化 一文,走馬觀花,只知用法,未細看后面的解釋。蔚為驚艷,心里想 Java 竟然有這么神奇的語法而一直未得知。因為在初始化集合時確實方便不少。原來做某些測試要初始化集合時會用到 commons-lang 包和 JDK 的 Arrays 工具類,現在知道可以這么用了:

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");

一不小心沒好好理解的人可能以為它是什么特別的語法,關鍵是大括號連一塊了,原作者也是在故作姿態,美其名曰:雙括弧語法(double-brace syntax)。真是亂花漸欲迷人眼,其實就是匿名類加初始塊。該文有解釋:***層括弧 實際是定義了一個內部匿名類 (Anonymous Inner Class),第二層括弧 實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。

那怎么去更好理解它呢?如果我們寫成如下的方式應該會更好理解吧,提個技巧,在 Eclipse 中對***段代碼按下 Ctrl + Shift + F 就如下了:

Map map = new HashMap() {   {    put("Name", "Unmi");    put("QQ", "1125535");   }  };

其實就是匿名類啊,會創建出一個 HashMap 的子類來,匿名類中一個 {} 括起來的初始化塊,里面自然可放置初始化代碼。{} 塊中的代碼編譯后會放到 <init>(),也就是構造方法中去,所以可用來初始化實例。如果是寫在 TestDoubleBrace 類中,編譯后你會看到會生成 TestDoubleBrace$1.class 文件,反編譯該文件內容是:

final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //創建了一個 HashMap 的子類 TestDoubleBracke$1  com.unmi.TestDoubleBrace$1();    Code:     0:   aload_0     1:   invokespecial   #8; //Method java/util/HashMap."<init>":()V   //{} 中的代碼放到了構造方法中去了     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  }

所以說白了,什么雙括弧語法啊,就是代碼寫得不規范,才使得那么的令人費解。如果還不能理解,再列兩個慣用代碼來:

JFrame frame = new JFrame();  frame.addMouseListener(new MouseAdapter() {   public void mouseClicked(MouseEvent e) {    // do womething here.   }  });   Thread thread = new Thread() {{ // 也學著樣把大括號也連一塊寫了    this.setName("作業處理線程");   }// 如果不重新定義 run() 方法,那么后面那個大括號也能與這個并一塊    public void run() {    // do something here.   }  };  thread.start();

應該沒問題了吧,上面是事件監聽器和多線程常用的寫法,如果他不把大括號連在一起,而是規范的寫代碼,相信您一開始也不會對所謂的 Double Brace Syntax 有太多的困惑。要說這種初始化方法運用到集合中還挺方便的,只是無端的多了些匿名類。

剛開始我看到這種Java雙括弧寫法也是把它奉若圣經,對它只一知半解,昨天在用 XStream 把一個對象生成 XML 文件時,其中有一個 List 屬性,我就借用了這種雙括符法來初始化元素,結果生成的 XML 文件走了樣,原因是 XStream 的 Converter 能處理 ArrayList,但無法很好的處理生成的 ArrayList 的匿名子類。因此才回頭認真的重新審視了一番這個所謂的雙括符初始化語法。

關于“Java雙括弧使用技巧是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浮梁县| 日喀则市| 稻城县| 汉中市| 黄冈市| 历史| 敖汉旗| 四子王旗| 蚌埠市| 定南县| 恩施市| 青阳县| 泰来县| 南皮县| 晴隆县| 海南省| 宁化县| 宾川县| 丽江市| 定州市| 凤山县| 梁平县| 文山县| 景洪市| 黄平县| 麻江县| 泸溪县| 刚察县| 凤冈县| 五华县| 宁德市| 手游| 大厂| 龙里县| 正蓝旗| 晋宁县| 上饶市| 乌苏市| 榆树市| 山阳县| 白沙|