Java雙括弧初始化操作技巧
由于Java語(yǔ)言的集合框架中(collections, 如list, map, set等)沒(méi)有提供任何簡(jiǎn)便的語(yǔ)法結(jié)構(gòu),這使得在建立常量集合時(shí)的工作非常繁索。每次建立時(shí)我們都要做:
定義一個(gè)臨時(shí)的集合類(lèi)變量 建立一個(gè)空集合的實(shí)例,然后賦值給變量 將數(shù)據(jù)放入集合中 最后將集合做為參數(shù)傳遞給方法
例如,要將一個(gè)Set變量傳給一個(gè)方法:
Set validCodes = new HashSet(); validCodes.add("XZ13s"); validCodes.add("AB21/X"); validCodes.add("YYLEX"); validCodes.add("AR2D"); removeProductsWithCodeIn(validCodes);
也可以用靜態(tài)初始的方法
private static final Set validCodes = new HashSet(); static { validCodes.add("XZ13s"); validCodes.add("AB21/X"); validCodes.add("YYLEX"); validCodes.add("AR2D"); } private static final Set validCodes = new HashSet(); static { validCodes.add("XZ13s"); validCodes.add("AB21/X"); validCodes.add("YYLEX"); validCodes.add("AR2D"); }
其實(shí),還有簡(jiǎn)結(jié)的方法,我們可以用雙括弧語(yǔ)法(double-brace syntax)建立并初始化一個(gè)新的集合:
private static final Set VALID_CODES = new HashSet() {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR2D"); }}; private static final Set VALID_CODES = new HashSet() {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR2D"); }};
或者
removeProductsWithCodeIn(new HashSet() {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR5E"); }}); removeProductsWithCodeIn(new HashSet() {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR5E"); }});
第一層括弧 實(shí)際是定義了一個(gè)內(nèi)部匿名類(lèi) (Anonymous Inner Class),第二層括弧 實(shí)際上是一個(gè)實(shí)例初始化塊 (instance initializer block),這個(gè)塊在內(nèi)部匿名類(lèi)構(gòu)造時(shí)被執(zhí)行。這個(gè)塊之所以被叫做“實(shí)例初始化塊”是因?yàn)樗鼈儽欢x在了一個(gè)類(lèi)的實(shí)例范圍內(nèi)。這和“靜態(tài)初始化塊 (static initialzer)”不同,因?yàn)檫@種塊在定義時(shí)在括弧前使用了static關(guān)鍵字,因此它的和類(lèi)在同一個(gè)范圍內(nèi)的,也就是說(shuō)當(dāng)類(lèi)加載時(shí)就會(huì)被執(zhí)行
實(shí)例初始化塊中可以使用其容器范圍內(nèi)的所有方法及變量,但特別需要注意的是實(shí)例初始化塊是在構(gòu)造器之前運(yùn)行的。
這種方法只適用于不是final的類(lèi),因?yàn)閒inal類(lèi)是無(wú)法建立內(nèi)部匿名子類(lèi),好在集合類(lèi)都沒(méi)有這個(gè)限制。因此,這種方法還可以被用來(lái)初始化其它任何對(duì)象,比如一個(gè)GUI對(duì)象:
add(new JPanel() {{ setLayout(...); setBorder(...); add(new JLabel(...)); add(new JSpinner(...)); }}); add(new JPanel() {{ setLayout(...); setBorder(...); add(new JLabel(...)); add(new JSpinner(...)); }});
這樣建立的內(nèi)部匿名類(lèi)的實(shí)例中包函它容器對(duì)像的引用。如果串行化(serialization)這個(gè)集合同時(shí)也會(huì)串行化它的內(nèi)部類(lèi)。
另外,這種雙括號(hào)初始化的方式針對(duì)map的初始化工作可以減少很多代碼,請(qǐng)看:
Map<String, Set<String>> baselineMap = new HashMap<>(); final String schema = "schema"; if (baselineMap.get(type) == null) { baselineMap.put(type, new HashSet<String>() {{ add(schema); }}); } else { baselineMap.put(type, new HashSet<String>(baselineMap.get(type)) {{ add(schema); }}); }
這段代碼我相信不用特別解釋?zhuān)径寄芸炊?,想想如果不用雙括號(hào)初始化的方式的話(huà)需要多寫(xiě)多少行代碼!~
以上就是關(guān)于Java雙括弧初始化的技巧,提高了代碼的可讀性,而且簡(jiǎn)化了代碼的數(shù)量,大家可以嘗試應(yīng)用到自己的項(xiàng)目中。
相關(guān)文章
java小知識(shí)之查詢(xún)數(shù)據(jù)庫(kù)數(shù)據(jù)的元信息
這篇文章主要給大家介紹了關(guān)于java小知識(shí)之查詢(xún)數(shù)據(jù)庫(kù)數(shù)據(jù)的元信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10Spring Boot集成SpringFox 3.0與Pageable參數(shù)處理方法
這篇文章主要介紹了Spring Boot集成SpringFox 3.0與Pageable參數(shù)處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10MyBatis如何實(shí)現(xiàn)多表查詢(xún)(多對(duì)一、一對(duì)多)
這篇文章主要給大家介紹了關(guān)于MyBatis如何實(shí)現(xiàn)多表查詢(xún)(多對(duì)一、一對(duì)多)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解
這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03