成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再談Java雙括弧技巧:不規范的語法?

開發 后端
本文就Java雙括弧技巧進行了另一番評論。Java雙括弧令初始化集合方便不少,不過似乎其實就是匿名類加初始塊。

Java雙括弧技巧回顧

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

  1. Map map = new HashMap() {{  
  2.   put("Name""Unmi");  
  3.   put("QQ""1125535");  
  4. }};  
  5.  
  6. List stooges = new ArrayList() {{  
  7.   add("Larry");  
  8.   add("Moe");  
  9.   add("Curly");  
  10. }};  
  11.  

看起來都是在一條語句里完成,而不需要分步驟寫成:

  1. Map map = new HashMap();  
  2. map.put("Name","Unmi");  
  3. map.put("QQ","1125535"); 

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

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

  1. Map map = new HashMap() {  
  2.  {  
  3.   put("Name""Unmi");  
  4.   put("QQ""1125535");  
  5.  }  
  6. }; 

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

  1. final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //創建了一個 HashMap 的子類 TestDoubleBracke$1  
  2. com.unmi.TestDoubleBrace$1();  
  3.   Code:  
  4.    0:   aload_0  
  5.    1:   invokespecial   #8//Method java/util/HashMap."<init>":()V   //{} 中的代碼放到了構造方法中去了  
  6.    4:   aload_0  
  7.    5:   ldc     #10//String Name  
  8.    7:   ldc     #12//String Unmi  
  9.    9:   invokevirtual   #14//Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;  
  10.    12:  pop  
  11.    13:  aload_0  
  12.    14:  ldc     #18//String QQ  
  13.    16:  ldc     #20//String 1125535  
  14.    18:  invokevirtual   #14//Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;  
  15.    21:  pop  
  16.    22:  return 
  17.  
  18. }  

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

  1. JFrame frame = new JFrame();  
  2. frame.addMouseListener(new MouseAdapter() {  
  3.  public void mouseClicked(MouseEvent e) {  
  4.   // do womething here.  
  5.  }  
  6. });  
  7.  
  8. Thread thread = new Thread() {{ // 也學著樣把大括號也連一塊寫了  
  9.   this.setName("作業處理線程");  
  10.  }// 如果不重新定義 run() 方法,那么后面那個大括號也能與這個并一塊  
  11.  
  12.  public void run() {  
  13.   // do something here.  
  14.  }  
  15. };  
  16. thread.start();  
  17.  

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

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

以上就是對Java雙括弧技巧的一些思考。本文來自隔葉黃鶯 The Blog of Unmi博客,原文名:《也說 Java 的雙括符初始化, 其實就是令人費解的不規范代碼》

【編輯推薦】

  1. Java語法技巧之雙括弧初始化
  2. Java程序調試技巧淺析
  3. 關于Java反射機制的一個實例
  4. 在Java應用程序中使用Jfreechart配置
  5. 淺談為什么Java接口中不允許定義變量
責任編輯:yangsai 來源: BlogJava
相關推薦

2009-08-12 17:43:54

雙括弧Java語法技巧

2012-09-18 09:17:34

Java規范代碼代碼

2022-05-20 08:17:43

Java日志

2019-10-28 14:37:10

MySQL 數據庫收藏

2021-07-31 23:09:42

GPU內存帶寬

2014-03-17 09:34:01

HTMLHTML閉合

2013-04-18 17:07:36

2010-09-28 15:30:39

3550配置dhcp

2010-06-17 16:27:26

WAP協議

2009-10-27 14:32:45

VB.NET類型級命名

2012-05-17 10:02:02

2024-04-03 09:55:21

代碼Go開發

2023-01-04 09:29:03

線程業務代碼

2009-12-29 20:49:47

綜合布線不規范現象

2009-12-09 10:46:06

PHP檢查語法錯誤

2010-06-18 23:01:16

IT管理安防產業H3C

2010-06-21 21:35:28

運維管理安防行業H3C

2009-12-03 15:24:39

雙wan路由器設置

2023-02-08 09:16:19

Git操作工廠類

2011-07-29 10:12:12

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美电影免费观看 | 自拍偷拍第一页 | 中文字幕一区在线 | 免费观看毛片 | 日韩中文在线观看 | 超碰97人人人人人蜜桃 | 免费看欧美一级片 | 国产99久久久国产精品下药 | 欧美精品欧美精品系列 | 一区二区视频在线观看 | 国产精品99久久久久久宅男 | 国产99热精品| 玖玖综合在线 | 好好的日在线视频 | 婷婷色网 | 欧美日韩在线精品 | 欧美一级在线免费观看 | 北条麻妃国产九九九精品小说 | 欧美精品黄| 天天射天天操天天干 | 久久久久国产精品 | 亚洲成人黄色 | 99久久精品一区二区毛片吞精 | 黄网站色大毛片 | 在线观看你懂的网站 | 亚洲精品一区在线观看 | 亚洲国产一区二区三区 | 伊人久久综合 | 视频第一区 | 亚洲精品一区二区二区 | 亚洲日韩视频 | 精品少妇一区二区三区在线播放 | 欧美三级在线 | 亚洲免费精品 | 91精品国产综合久久福利软件 | 在线免费观看日本视频 | 理论片午午伦夜理片影院 | 精品日韩一区 | 国产精品久久久久久福利一牛影视 | 中文字幕11页 | 丝袜天堂|