2010-09-22 13 views
15

Sto cercando una sintassi compatta per creare un'istanza di una raccolta e aggiungervi alcuni elementi. Attualmente uso la seguente sintassi:Sintassi compatta per la creazione di istanze di una raccolta di inizializzazione

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

Mi sembra di ricordare che c'è un modo più compatto di fare questo che utilizza una sottoclasse anonima di ArrayList, poi aggiunge gli oggetti nel costruttore della sottoclasse. Tuttavia, non riesco a ricordare l'esatta sintassi.

risposta

2

Forse era

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

Conosciuto anche come l'inizializzazione doppia staffa.

8

Credo che stai pensando di

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

che, una comapcted, dà

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

fugly, per non dire altro. Tuttavia, esiste una variante del metodo Arrays.asList: Arrays.asList(T...a) che fornisce compatibilità e leggibilità. A titolo di esempio, dà la seguente riga di codice:

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

e notare non si crea una sottoclasse anonima di ArrayList di utilizzo dubbia.

0

forse è solo me, ma non vedo il punto delle cose di complicazione, puramente nel perseguimento di scrivere codice più breve/più veloce. Data la scelta di digitare marginalmente meno righe di codice e molto più facile debugging/revisione, sono abbastanza sicuro di scegliere la seconda opzione.

Quindi, a meno che non vi sia una ragione particolare per spingere per mantenere questo breve, direi attenersi al rasoio di Ockham, e dato un numero di soluzioni a un problema, andare con il più semplice. In questo modo, quando qualcosa va storto (che la legge di Murphy stabilisce chiaramente che lo farà) avrai un tempo molto più facile per seguirlo. :)

1

è possibile creare una funzione di utilità:

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

Così si potrebbe chiamare come:

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

In questo modo, è possibile compilare un elenco molto facilmente, e ancora tenerlo mutabile .

Problemi correlati