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

Java語(yǔ)法技巧之雙括弧初始化

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

譯者序:這是我在JavaIdioms上看到一個(gè)Java使用技巧。使用Java這么多年了,也還是頭一次看到,還很實(shí)用。別看這小技巧好像很簡(jiǎn)單,但保證你不會(huì)在任何一書Java教材上看到,因?yàn)樗皇且粋€(gè)真正的語(yǔ)法規(guī)范,而是一個(gè)語(yǔ)法的用法變種。小技巧還蘊(yùn)含著Java的深層知識(shí),就是身經(jīng)百戰(zhàn)的老手也不一定能說(shuō)出其中奧妙。

翻譯正文:

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

◆定義一個(gè)臨時(shí)的集合類變量

◆建立一個(gè)空集合的實(shí)例,然后賦值給變量

◆將數(shù)據(jù)放入集合中

◆最后將集合做為參數(shù)傳遞給方法

例如,要將一個(gè)Set變量傳給一個(gè)方法:

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

也可以用靜態(tài)初始的方法

  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. }    

其實(shí),還有簡(jiǎn)結(jié)的方法,我們可以用雙括弧語(yǔ)法(double-brace syntax)建立并初始化一個(gè)新的集合:

  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語(yǔ)法技巧:雙括弧的意義

第一層括弧 實(shí)際是定義了一個(gè)內(nèi)部匿名類 (Anonymous Inner Class),第二層括弧 實(shí)際上是一個(gè)實(shí)例初始化塊 (instance initializer block),這個(gè)塊在內(nèi)部匿名類構(gòu)造時(shí)被執(zhí)行。這個(gè)塊之所以被叫做“實(shí)例初始化塊”是因?yàn)樗鼈儽欢x在了一個(gè)類的實(shí)例范圍內(nèi)。這和“靜態(tài)初始化塊 (static initialzer)”不同,因?yàn)檫@種塊在定義時(shí)在括弧前使用了static關(guān)鍵字,因此它的和類在同一個(gè)范圍內(nèi)的,也就是說(shuō)當(dāng)類加載時(shí)就會(huì)被執(zhí)行(詳情可參考Java語(yǔ)言規(guī)范)。實(shí)例初始化塊中可以使用其容器范圍內(nèi)的所有方法及變量,但特別需要注意的是實(shí)例初始化塊是在構(gòu)造器之前運(yùn)行的。

這種方法只適用于不是final的類,因?yàn)閒inal類是無(wú)法建立內(nèi)部匿名子類,好在集合類都沒(méi)有這個(gè)限制。因此,這種方法還可以被用來(lái)初始化其它任何對(duì)象,比如一個(gè)GUI對(duì)象:

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

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

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

【編輯推薦】

  1. Java程序調(diào)試技巧淺析
  2. 關(guān)于Java反射機(jī)制的一個(gè)實(shí)例
  3. 在Java應(yīng)用程序中使用Jfreechart配置
  4. 淺談為什么Java接口中不允許定義變量
  5. Java的異常和斷言學(xué)習(xí)筆記
責(zé)任編輯:yangsai 來(lái)源: JavaEye論壇
相關(guān)推薦

2009-08-12 18:07:04

Java雙括弧

2010-01-05 15:35:21

.NET Framew

2019-11-04 13:50:36

Java數(shù)組編程語(yǔ)言

2024-10-29 11:27:27

2023-11-12 23:08:17

C++初始化

2011-08-15 17:52:21

iPhone應(yīng)用對(duì)象NSString

2009-06-11 13:26:16

Java數(shù)組聲明創(chuàng)建

2012-03-13 13:38:42

Java

2010-01-22 13:16:05

VB.NET初始化數(shù)組

2012-05-23 12:46:53

JavaJava類

2009-09-08 09:48:34

LINQ初始化數(shù)組

2009-11-11 15:29:15

ADO初始化

2011-06-17 15:29:44

C#對(duì)象初始化器集合初始化器

2021-03-12 10:30:11

SpringMVC流程初始化

2010-07-28 10:22:33

FlexApplica

2022-07-06 10:37:45

SpringServlet初始化

2020-12-03 09:50:52

容器IoC流程

2011-08-02 15:47:28

Cocos2D Animation

2012-02-28 10:04:09

Java

2015-10-30 09:51:19

Java重寫初始化隱患
點(diǎn)贊
收藏

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