2015-02-09 86 views
8

我知道我可以聲明和使用雙括號初始化List雙括號初始化與嵌套集合

// (1) 
List<Object> myList = new ArrayList<object>(){{ 
    add("Object1"); 
    add("Object2"); 
}}; 

但我想一個List<Map<Object,Object>>的:

// (2) 
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>(); 

我如何使用雙括號初始化(見(1))與嵌套集合?我的目標是在一行中聲明和初始化數據結構。

另外我想知道是否有使用雙大括號初始化我必須知道的某些缺點。

+2

只需使用「正常」初始化代碼;雙括號初始化難以閱讀。代碼是WORM(一次寫入,多次讀取)。注意:如果這是一個靜態列表,請使用靜態初始化程序。 – fge 2015-02-09 12:58:08

+1

你爲什麼要編寫這樣的代碼?你一個人工作嗎? – kolossus 2015-02-09 13:00:41

+4

不要使用「雙括號」,因爲每次你這樣做時,你都會創建一個無用的ArrayList子類。 – 2015-02-09 13:00:55

回答

5

這不是個好主意,因爲它很難看,但你可以做以下操作:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{ 
        add(new HashMap<Object, Object>() {{ 
         put(key, obj); 
        }}); 
       }}; 
+0

不僅難以閱讀,而且還表演不好。 – 2015-02-09 13:03:03

+0

@vang:謝謝你的時間和答案,但在這個你沒有初始化列表:( – 2015-02-09 13:06:17

+2

你是什麼意思?比什麼新的ArrayList >()是? – Bracadabra 2015-02-09 13:07:50

10

避免雙重支柱初始化,因爲它一)驚喜你的同事,是很難讀,二)危害的性能和c)可能會導致對象相等問題(每個創建的對象都有一個唯一的類對象)。

如果你正在編寫代碼風格指南,這種欺騙屬於不要部分。

如果你真的想能夠內聯創建列表和地圖,只需繼續並創建一些工廠方法即可。可能看起來像這樣:

List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")), 
    Maps.of(new Entry("baz", "foobar")) 
); 

但是,Vangs示例顯示了您的示例語法到底如何用於雙括號初始化。

+1

雙大括號代碼也可以在測試中拋出問題。例如,如果它是靜態初始化的,你會如何嘲笑xyz? – vikingsteve 2015-02-09 13:25:48