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

Java語法技巧之雙括弧初始化

開發 后端
本文介紹了一個Java語法技巧:雙括弧的使用。第一層括弧 實際是定義了一個內部匿名類 (Anonymous Inner Class),第二層括弧 實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。

譯者序:這是我在JavaIdioms上看到一個Java使用技巧。使用Java這么多年了,也還是頭一次看到,還很實用。別看這小技巧好像很簡單,但保證你不會在任何一書Java教材上看到,因為它不是一個真正的語法規范,而是一個語法的用法變種。小技巧還蘊含著Java的深層知識,就是身經百戰的老手也不一定能說出其中奧妙。

翻譯正文:

由于Java語言的集合框架中(collections, 如list, map, set等)沒有提供任何簡便的語法結構,這使得在建立常量集合時的工作非常繁索。每次建立時我們都要做:

◆定義一個臨時的集合類變量

◆建立一個空集合的實例,然后賦值給變量

◆將數據放入集合中

◆最后將集合做為參數傳遞給方法

例如,要將一個Set變量傳給一個方法:

  1. Set< String> validCodes = new HashSet< String>();    
  2. validCodes.add("XZ13s");    
  3. validCodes.add("AB21/X");    
  4. validCodes.add("YYLEX");    
  5. validCodes.add("AR2D");    
  6. removeProductsWithCodeIn(validCodes);    

也可以用靜態初始的方法

  1. private static final Set< String> validCodes = new HashSet< String>();    
  2. static {    
  3.        validCodes.add("XZ13s");    
  4.        validCodes.add("AB21/X");    
  5.        validCodes.add("YYLEX");    
  6.        validCodes.add("AR2D");    
  7. }    

其實,還有簡結的方法,我們可以用雙括弧語法(double-brace syntax)建立并初始化一個新的集合:

  1. private static final Set< String> VALID_CODES = new HashSet< String>() {{    
  2.        add("XZ13s");    
  3.        add("AB21/X");    
  4.        add("YYLEX");    
  5.        add("AR2D");    
  6. }};    

或者

  1. removeProductsWithCodeIn(new HashSet< String>() {{    
  2.        add("XZ13s");    
  3.        add("AB21/X");    
  4.        add("YYLEX");    
  5.        add("AR5E");    
  6. }});    

Java語法技巧:雙括弧的意義

第一層括弧 實際是定義了一個內部匿名類 (Anonymous Inner Class),第二層括弧 實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。這個塊之所以被叫做“實例初始化塊”是因為它們被定義在了一個類的實例范圍內。這和“靜態初始化塊 (static initialzer)”不同,因為這種塊在定義時在括弧前使用了static關鍵字,因此它的和類在同一個范圍內的,也就是說當類加載時就會被執行(詳情可參考Java語言規范)。實例初始化塊中可以使用其容器范圍內的所有方法及變量,但特別需要注意的是實例初始化塊是在構造器之前運行的。

這種方法只適用于不是final的類,因為final類是無法建立內部匿名子類,好在集合類都沒有這個限制。因此,這種方法還可以被用來初始化其它任何對象,比如一個GUI對象:

  1. add(new JPanel() {{    
  2.        setLayout(...);    
  3.        setBorder(...);    
  4.        add(new JLabel(...));    
  5.        add(new JSpinner(...));    
  6. }});    
  7.   

這樣建立的內部匿名類的實例中包函它容器對像的引用。如果串行化(serialization)這個集合同時也會串行化它的外部類。

以上就介紹了Java語法技巧之雙括弧初始化。本文來自Alan Gao的譯文,原文:《Java技巧之雙括弧初始化》

【編輯推薦】

  1. Java程序調試技巧淺析
  2. 關于Java反射機制的一個實例
  3. 在Java應用程序中使用Jfreechart配置
  4. 淺談為什么Java接口中不允許定義變量
  5. Java的異常和斷言學習筆記
責任編輯:yangsai 來源: JavaEye論壇
相關推薦

2009-08-12 18:07:04

Java雙括弧

2010-01-05 15:35:21

.NET Framew

2019-11-04 13:50:36

Java數組編程語言

2024-10-29 11:27:27

2023-11-12 23:08:17

C++初始化

2011-08-15 17:52:21

iPhone應用對象NSString

2012-03-13 13:38:42

Java

2009-06-11 13:26:16

Java數組聲明創建

2010-01-22 13:16:05

VB.NET初始化數組

2012-05-23 12:46:53

JavaJava類

2009-09-08 09:48:34

LINQ初始化數組

2009-11-11 15:29:15

ADO初始化

2010-07-28 10:22:33

FlexApplica

2021-03-12 10:30:11

SpringMVC流程初始化

2022-07-06 10:37:45

SpringServlet初始化

2020-12-03 09:50:52

容器IoC流程

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2011-08-02 15:47:28

Cocos2D Animation

2024-01-15 06:34:09

Gin鏡像容器

2010-02-06 10:24:48

C++二維數組初始化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91看国产| 视频1区| 国产一区日韩在线 | 91一区二区三区 | 福利视频网址 | 午夜a√| 欧美日韩国产在线 | 一区二区在线免费观看 | 国产精品一区一区三区 | 欧美午夜精品理论片a级按摩 | 国产精品a久久久久 | 又黑又粗又长的欧美一区 | 精品国产区 | 亚洲精品国产电影 | 亚洲一二三在线观看 | 欧美成人精品一区 | 观看av| 国产免费一区二区三区 | 精品色 | 欧美中文字幕一区二区三区 | 超碰最新在线 | 亚洲精品在线免费 | 欧美精品一区三区 | 午夜视频免费在线观看 | 一区二区三区中文字幕 | 特黄特色大片免费视频观看 | 成人精品视频免费 | 精品一区二区三区四区外站 | 一级欧美 | 欧美日韩在线观看一区 | 颜色网站在线观看 | 国产91精品久久久久久久网曝门 | 99久久免费精品视频 | 在线视频99 | 国产欧美精品一区二区 | 日韩成人影院 | 久久久精品 | 午夜寂寞影院在线观看 | yiren22综合网成人 | 99精品久久久久 | 国产精品日韩欧美一区二区 |