2010-02-03 15 views
7

Mi chiedevo, quale metodo di inizializzazione di una lista è migliore?Quale metodo di inizializzazione dell'elenco è migliore


public class Main { 
    private final List<String> l = new ArrayList<String>(); 

    { 
     l.add("a"); 
     l.add("b"); 
     l.add("c"); 
    } 
} 

public class Main { 

    private final List<String> l = new ArrayList<String>() {{ 
     l.add("a"); 
     l.add("b"); 
     l.add("c");   
    }}; 
} 

+2

Latter funziona, ma non è necessario utilizzare il prefisso 'l' nel corpo. Semplice 'add (" a ");' è sufficiente. – Ahe

risposta

2

Né, perché nessuno sta rendendo l'elenco immutabile. Immagino che tu voglia renderlo immutabile, quando usi final. Se questo non è il caso, mi scuso per la mia ipotesi.

Se ho ragione, supponendo che dovresti dare un'occhiata a Collections.unmodifiableList(). E quest'ultimo tornerà utile,

private final List<String> l = Collections.unmodifiableList(new ArrayList<String>() {{ 
     add("a"); 
     add("b"); 
     add("c");   
}}); 

Altrimenti, dfa è corretto nel suggerire il primo.

Un altro modo può essere questo,

private final List<String> l = Collections.unmodifiableList(Arrays.asList("a", 
            "b", "c")); 
+0

Il secondo esempio è finale, quindi è possibile accedere a 'l' all'interno del blocco anonimo presumo. Questo è fuorviante perché non ne hai bisogno e potresti semplicemente scrivere 'add (" a ")' invece di 'l.add (" a ")' ma presumo che sia la ragione piuttosto che la pseudo-immutabilità. – cletus

6

Io preferisco usare metodi factory statici della prossima genere:

public final class CollectionUtils { 
    private CollectionUtils() { 
    } 

    public static <T> List<T> list(T... data) { 
     return Arrays.asList(data); 
    } 

    public static <T> ArrayList<T> newArrayList() { 
     return new ArrayList<T>(); 
    } 

    public static <T> ArrayList<T> newArrayList(T... data) { 
     return new ArrayList<T>(list(data)); 
    } 
} 

Quindi, è possibile utilizzare nel codice nel modo seguente:

import static CollectionUtils.list; 
import static CollectionUtils.newArrayList; 

public class Main { 
    private final List<String> l1 = list("a", "b", "c"); 
    private final List<String> l2 = newArrayList("a", "b", "c"); 
} 

Così si ottiene un modo relativamente compatto di creare e compilare elenchi e non è necessario duplicare clarations. Si noti che il metodo list crea solo la visualizzazione elenco dell'array. Non è possibile aggiungere elementi in seguito (o rimuovere). Nel frattempo newArrayList crea il solito oggetto ArrayList.

Come osservato Joachim Sauer, questi metodi di utilità (e molte altre cose utili) si possono trovare in Google Collections biblioteca (che ora è una parte di Guava progetto).

+1

Devo votare questo, poiché questo è l'approccio che ho usato su diversi progetti. Tuttavia, penso che tu abbia dimenticato le importazioni statiche nell'esempio "Main" :) – Christoffer

+0

IDE di solito le aggiunge per me) – Rorick

+2

Google Collections fa questo (e molte altre cose) per te. Questi metodi di fabbrica sono nella classe 'Lists' per esempio. –

Problemi correlati