(vecchio thread, ma solo 2 centesimi poiché nessuno menziona Guava o altre librerie e altri dettagli)
Se puoi, usa Guava
Vale la pena sottolineare il modo Guava, che semplifica notevolmente questi shenanigans:
uso
Per un elenco immutabile
Usa la ImmutableListclasse e i suoi metodi of()e copyOf()factory (gli elementi non possono essere nulli) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Per un elenco mutevole
Usa la Listsclasse e i suoi newArrayList()metodi di fabbrica:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Nota anche metodi simili per altre strutture di dati in altre classi, ad esempio in Sets.
L'attrazione principale potrebbe essere quella di ridurre il disordine dovuto ai generici per la sicurezza del tipo, come l'uso dei metodi di fabbrica della Guava consente di dedurre i tipi per la maggior parte del tempo. Tuttavia, questo argomento contiene meno acqua da quando Java 7 è arrivato con il nuovo operatore Diamond.
Ma non è l'unico motivo (e Java 7 non è ancora dappertutto): anche la sintassi abbreviata è molto utile e gli inizializzatori dei metodi, come visto sopra, consentono di scrivere codice più espressivo. Fai in una chiamata Guava ciò che richiede 2 con le attuali Collezioni Java.
Se non puoi ...
Per un elenco immutabile
Usa la Arraysclasse JDK e il suo asList()metodo factory, racchiuso in un Collections.unmodifiableList():
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Si noti che il tipo restituito per asList()è un'implementazione Listconcreta che ArrayListutilizza, ma NON lo è java.util.ArrayList . È un tipo interiore, che emula unArrayList ma in realtà fa direttamente riferimento all'array passato e lo fa "scrivere attraverso" (le modifiche si riflettono nell'array).
Proibisce modifiche attraverso alcuni dei Listmetodi dell'API semplicemente estendendo un AbstractList(quindi, l'aggiunta o la rimozione di elementi non è supportata), tuttavia consente alle chiamate set()di sovrascrivere gli elementi. Quindi questa lista non è veramente immutabile e asList()dovrebbe essere racchiusa una chiamata a Collections.unmodifiableList().
Vedere il passaggio successivo se è necessario un elenco modificabile.
Per un elenco mutevole
Come sopra, ma avvolto con un effettivo java.util.ArrayList:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
Per scopi educativi: il buon vecchio modo manuale
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}