2015-02-09 13 views
8

wiem, że mogę zadeklarować i zainicjować List stosując podwójne szelki:Pokój inicjalizacji klamra z kolekcji zagnieżdżonych

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

Ale chcę List z <Map<Object,Object>>:

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

Jak mogę użyć podwójną klamrę inicjalizacja (zobacz (1)) z zagnieżdżonymi kolekcjami? Moim celem jest zadeklarowanie i zainicjowanie struktury danych w jednym wierszu.

Chciałbym również wiedzieć, czy przy stosowaniu podwójnego nawiasu występują pewne problemy, o których muszę wiedzieć.

+2

Wystarczy użyć "normalnego" kodu inicjalizacyjnego; Inicjalizacja podwójnego nawiasu jest trudna do odczytania. Kod to WORM (Write Once, Read Many). Uwaga: jeśli jest to lista statyczna, użyj statycznego inicjalizatora. – fge

+1

Dlaczego chcesz napisać taki kod? Czy pracujesz sam? – kolossus

+4

Nie używaj "podwójnych nawiasów", ponieważ za każdym razem tworzysz niepotrzebną podklasę tablicy ArrayList. –

Odpowiedz

5

To nie jest dobry pomysł, bo to trudne do odczytania, ale można to zrobić następujące:

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

Nie tylko trudno czytać, ale także złe dla występów. –

+0

@vang: dziękuję za poświęcony czas i odpowiedź, ale w tym przypadku nie zainicjalizowałeś listy :( –

+2

Co masz na myśli? Niż co nowego ArrayList >() to? – Bracadabra

10

uniknąć podwójnego inicjalizacji nawias, ponieważ a) zaskakuje swoich współpracowników i jest trudne do odczytania, b) szkodzi wydajności i c) może powodować problemy z równością obiektów (każdy utworzony obiekt ma unikalny obiekt klasy).

Jeśli pracujesz nad przewodnikiem po stylu kodu, ten rodzaj oszustwa należy do sekcji , a nie.

Jeśli naprawdę chcesz mieć możliwość tworzenia list i map w linii, po prostu śmiało i stwórz kilka metod fabrycznych. Mógłby wyglądać następująco:

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

Jednak przykład Vangs pokazuje dokładnie, jak składnia dla przykładu jest dla podwójnego inicjalizacji nawiasów.

+1

Podwójny kod klamrowy może również powodować problemy podczas testowania. Jak można kpić xyz, jeśli jest na przykład inicjalizowany statycznie? – vikingsteve

Powiązane problemy