程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java雙括弧初始化操作技能

Java雙括弧初始化操作技能

編輯:關於JAVA

Java雙括弧初始化操作技能。本站提示廣大學習愛好者:(Java雙括弧初始化操作技能)文章只能為提供參考,不一定能成為您想要的結果。以下是Java雙括弧初始化操作技能正文


因為Java說話的聚集框架中(collections, 如list, map, set等)沒有供給任何輕便的語法構造,這使得在樹立常量聚集時的任務異常繁索。每次樹立時我們都要做:

界說一個暫時的聚集類變量 樹立一個空聚集的實例,然後賦值給變量 將數據放入聚集中 最初將聚集做為參數傳遞給辦法

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

Set validCodes = new HashSet();
validCodes.add("XZ13s");
validCodes.add("AB21/X");
validCodes.add("YYLEX");
validCodes.add("AR2D");
removeProductsWithCodeIn(validCodes);

也能夠用靜態初始的辦法

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

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

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

第一層括弧 現實是界說了一個外部匿名類 (Anonymous Inner Class),第二層括弧 現實上是一個實例初始化塊 (instance initializer block),這個塊在外部匿名類結構時被履行。這個塊之所以被叫做“實例初始化塊”是由於它們被界說在了一個類的實例規模內。這和“靜態初始化塊 (static initialzer)”分歧,由於這類塊在界說時在括弧前應用了static症結字,是以它的和類在統一個規模內的,也就是說當類加載時就會被履行

實例初始化塊中可使用其容器規模內的一切辦法及變量,但特殊須要留意的是實例初始化塊是在結構器之前運轉的。

這類辦法只實用於不是final的類,由於final類是沒法樹立外部匿名子類,好在聚集類都沒有這個限制。是以,這類辦法還可以被用來初始化其它任何對象,好比一個GUI對象:

add(new JPanel() {{
setLayout(...);
setBorder(...);
add(new JLabel(...));
add(new JSpinner(...));
}});
add(new JPanel() {{
setLayout(...);
setBorder(...);
add(new JLabel(...));
add(new JSpinner(...));
}});

如許樹立的外部匿名類的實例中包函它容器對像的援用。假如串行化(serialization)這個聚集同時也會串行化它的外部類。

別的,這類雙括號初始化的方法針對map的初始化任務可以削減許多代碼,請看:       

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

這段代碼我信任不消特殊說明,根本都能看懂,想一想假如不消雙括號初始化的方法的話須要多寫若干行代碼!~

以上就是關於Java雙括弧初始化的技能,進步了代碼的可讀性,並且簡化了代碼的數目,年夜家可以測驗考試運用到本身的項目中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved