AMethod(new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR5E");
}});
第一層括弧 實際是定義了一個內部匿名類
(Anonymous Inner Class),
第二層括弧 實際上是一個實例初始化塊
(instance initializer block),這個塊在內部匿名類構造時被執行。這個塊之所以被叫做“實例初始化塊”是因為它們被定義在了一個類的實例范圍內。這和“靜態初始化塊 (static initialzer)”不同,因為“靜態初始化塊”塊在定義時在括弧前使用了static關鍵字,因此它得和類在同一個范圍內的,也就是說當類加載時就會被執行(更詳情,可參考Java語言規范
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 )。實例初始化塊中可以使用其容器范圍內的所有方法及變量,但特別需要注意的是實例初始化塊是在構造器之前運行的。
這種方法只適用于不是final的類,因為final類是無法建立內部匿名子類,好在集合類都沒有這個限制。因此,這種方法還可以被用來初始化其它任何對象,比如一個GUI對象:
add(new JPanel() {{
setLayout(...);
setBorder(...);
add(new JLabel(...));
add(new JSpinner(...));
}});
這樣建立的內部匿名類的實例中包函它容器對像的引用。如果串行化(serialization)這個集合同時也會串行化它的內部類.
開心過好每一天。。。。。