HashMap定義並初始化:
Map map = new HashMap() {
{
put( "Name" , "Unmi" );
put( "QQ" , "1125535" );
}
};
List定義並初始化:
List stooges = new ArrayList() {{
add( "Larry" );
add( "Moe" );
add( "Curly" );
}};
HashSet定義並初始化:
Set<String> VALID_CODES = new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR2D");
}};
原理:
第一層括弧 實際是定義了一個內部匿名類 (Anonymous Inner Class),第二層括弧 實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。這個塊之所以被叫做“實例初始化塊”是因爲它們被定義在了一個類的實例範圍內。這和“靜態初始化塊 (static initialzer)”不同,因爲這種塊在定義時在括弧前使用了static關鍵字,因此它的和類在同一個範圍內的,也就是說當類加載時就會被執行。實例初始化塊中可以使用其容器範圍內的所有方法及變量,但特別需要注意的是實例初始化塊是在構造器之前運行的。
這種方法只適用於不是final的類,因爲final類是無法建立內部匿名子類,好在集合類都沒有這個限制。因此,這種方法還可以被用來初始化其它任何對象。