2015-02-09 19 views
8

so di poter dichiarare e inizializzare un List utilizzando parentesi graffe doppie:inizializzazione Doppia coppia con collezioni annidate

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

Ma voglio un List di <Map<Object,Object>>:

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

Come posso utilizzare il doppio brace inizializzazione (vedi (1)) con collezioni nidificate? Il mio obiettivo è dichiarare e inizializzare la struttura dei dati in una singola riga.

Inoltre vorrei sapere se ci sono alcuni svantaggi quando si utilizza l'inizializzazione doppia parentesi che devo essere a conoscenza.

+2

Basta usare il codice di inizializzazione "normale"; l'inizializzazione della doppia parentesi è difficile da leggere. Il codice è WORM (Write Once, Read Many). Nota: se si tratta di un elenco statico, utilizzare un inizializzatore statico. – fge

+1

Perché vorresti scrivere un codice del genere? Lavori da solo? – kolossus

+4

Non utilizzare le "doppie parentesi", perché ogni volta che lo fai, stai creando una sottoclasse inutile di ArrayList. –

risposta

5

Non è buona idea, perché è difficile da leggere, ma si può fare seguente:

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

Non solo difficile da leggere, ma anche male per le prestazioni. –

+0

@vang: grazie per il tuo tempo e la tua risposta ma in questo non hai iniziato la lista :( –

+2

Cosa intendi? Di quale nuovo ArrayList >() è? – Bracadabra

10

evitare il doppio di inizializzazione brace in quanto a) sorprende i suoi colleghi ed è difficile da leggere, b) danneggia le prestazioni e la c) può causare problemi con l'uguaglianza degli oggetti (ogni oggetto creato ha un oggetto di classe univoco).

Se si sta lavorando a una guida in stile codice questo tipo di trucco appartiene alla sezione non.

Se si desidera realmente creare elenchi e mappe in linea, è sufficiente procedere e creare alcuni metodi di produzione. Potrebbe assomigliare a questo:

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

Tuttavia, Vangs esempio mostra esattamente come la sintassi per il tuo esempio è per l'inizializzazione doppia brace.

+1

Il doppio codice di duplicazione può anche causare problemi durante i test. Come potresti prendere in giro xyz se è inizializzato staticamente, per esempio? – vikingsteve

Problemi correlati