自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

再談Java雙括弧技巧:不規(guī)范的語(yǔ)法?

開發(fā) 后端
本文就Java雙括弧技巧進(jìn)行了另一番評(píng)論。Java雙括弧令初始化集合方便不少,不過(guò)似乎其實(shí)就是匿名類加初始?jí)K。

Java雙括弧技巧回顧

初看 cgaolei 翻譯的 Java技巧之雙括弧初始化 一文,走馬觀花,只知用法,未細(xì)看后面的解釋。蔚為驚艷,心里想 Java 竟然有這么神奇的語(yǔ)法而一直未得知。因?yàn)樵诔跏蓟蠒r(shí)確實(shí)方便不少。原來(lái)做某些測(cè)試要初始化集合時(shí)會(huì)用到 commons-lang 包和 JDK 的 Arrays 工具類,現(xiàn)在知道可以這么用了:

  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.  

看起來(lái)都是在一條語(yǔ)句里完成,而不需要分步驟寫成:

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

一不小心沒(méi)好好理解的人可能以為它是什么特別的語(yǔ)法,關(guān)鍵是大括號(hào)連一塊了,原作者也是在故作姿態(tài),美其名曰:雙括弧語(yǔ)法(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 就如下了:

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

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

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

所以說(shuō)白了,什么雙括弧語(yǔ)法啊,就是代碼寫得不規(guī)范,才使得那么的令人費(fèi)解。如果還不能理解,再列兩個(gè)慣用代碼來(lái):

  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() {{ // 也學(xué)著樣把大括號(hào)也連一塊寫了  
  9.   this.setName("作業(yè)處理線程");  
  10.  }// 如果不重新定義 run() 方法,那么后面那個(gè)大括號(hào)也能與這個(gè)并一塊  
  11.  
  12.  public void run() {  
  13.   // do something here.  
  14.  }  
  15. };  
  16. thread.start();  
  17.  

應(yīng)該沒(méi)問(wèn)題了吧,上面是事件監(jiān)聽器和多線程常用的寫法,如果他不把大括號(hào)連在一起,而是規(guī)范的寫代碼,相信您一開始也不會(huì)對(duì)所謂的 Double Brace Syntax 有太多的困惑。要說(shuō)這種初始化方法運(yùn)用到集合中還挺方便的,只是無(wú)端的多了些匿名類。

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

以上就是對(duì)Java雙括弧技巧的一些思考。本文來(lái)自隔葉黃鶯 The Blog of Unmi博客,原文名:《也說(shuō) Java 的雙括符初始化, 其實(shí)就是令人費(fèi)解的不規(guī)范代碼》

【編輯推薦】

  1. Java語(yǔ)法技巧之雙括弧初始化
  2. Java程序調(diào)試技巧淺析
  3. 關(guān)于Java反射機(jī)制的一個(gè)實(shí)例
  4. 在Java應(yīng)用程序中使用Jfreechart配置
  5. 淺談為什么Java接口中不允許定義變量
責(zé)任編輯:yangsai 來(lái)源: BlogJava
相關(guān)推薦

2009-08-12 17:43:54

雙括弧Java語(yǔ)法技巧

2012-09-18 09:17:34

Java規(guī)范代碼代碼

2022-05-20 08:17:43

Java日志

2019-10-28 14:37:10

MySQL 數(shù)據(jù)庫(kù)收藏

2014-03-17 09:34:01

HTMLHTML閉合

2021-07-31 23:09:42

GPU內(nèi)存帶寬

2009-10-27 14:32:45

VB.NET類型級(jí)命名

2013-04-18 17:07:36

2010-09-28 15:30:39

3550配置dhcp

2010-06-17 16:27:26

WAP協(xié)議

2023-01-04 09:29:03

線程業(yè)務(wù)代碼

2009-12-29 20:49:47

綜合布線不規(guī)范現(xiàn)象

2024-04-03 09:55:21

代碼Go開發(fā)

2009-12-09 10:46:06

PHP檢查語(yǔ)法錯(cuò)誤

2012-05-17 10:02:02

2010-06-18 23:01:16

IT管理安防產(chǎn)業(yè)H3C

2010-06-21 21:35:28

運(yùn)維管理安防行業(yè)H3C

2023-02-08 09:16:19

Git操作工廠類

2011-07-29 10:12:12

JavaScript

2022-09-14 08:22:50

AlloyDB高性能高可用性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)