2010-09-22 99 views
15

我正在尋找一個用於實例化集合並向其中添加幾個項目的緊湊語法。我目前使用的語法:用於實例化初始化集合的緊湊語法

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" })); 

我好像記得有這樣做的,它使用的ArrayList一個匿名子類的更緊湊的方式,然後將在子類的構造函數的項目。但是,我似乎無法記住確切的語法。

回答

2

也許這是

Collection<String> collection = new ArrayList<String>() {{ 
    add("foo"); 
    add("bar"); 
}}; 

也稱爲雙支架初始化。

8

我猜你正在考慮

collection = new ArrayList<String>() { // anonymous subclass 
    { // anonymous initializer 
     add("1"); 
     add("2"); 
     add("3"); 
    } 
} 

其中,一個comapcted,給人

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }} 

的fugly,至少可以這樣說。但是,Arrays.asList方法有一個變體:Arrays.asList(T...a),它提供了可協作性和可讀性。作爲一個例子,它給出了下面的一行代碼:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter 

同時注意不要創建可疑使用ArrayList中的一個匿名子類。

0

也許這只是我,但我沒有看到的事情複雜了點,純粹是爲了追求更短的寫/更快的代碼。由於可以選擇少量代碼行,並且更容易調試/修改,所以我很確定我會選擇第二個選項。所以除非有特別的理由要求保持這個短小,否則我會說堅持Ockham的剃鬚刀,並給出一些問題的解決方案,請使用最簡單的方法。這樣,當某些事情出錯時(墨菲的法律明確規定它會這樣),您將有更容易的時間來追蹤它。 :)

1

您可以創建一個效用函數:

@SafeVarargs 
public static <T> List<T> listOf(T ... values) { 
    return new ArrayList<T>(Arrays.asList(values)); 
} 

所以,你可以把它想:

collection = MyUtils.listOf("1", "2", "3"); 

這樣的話,你可以很容易填充列表,並仍然保持可變。