In Java, come è possibile creare una lettura di sola lettura ArrayList
(in modo che nessuno possa aggiungere elementi, modificare o eliminare elementi) dopo l'inizializzazione?make ArrayList Read only
44
A
risposta
86
Passare la lista array in Collections.unmodifiableList(). Restituisce una vista non modificabile dell'elenco specificato. Utilizzare solo questo Elenco restituito e mai l'ArrayList originale.
0
Sei sicuro di voler utilizzare ArrayList
in questo caso?
Forse sarebbe meglio per popolare la prima volta un ArrayList
con tutte le informazioni, e poi convertire il ArrayList
in una matrice finale, quando il programma Java inizializza.
2
Passare l'oggetto elenco a Collections.unmodifiableList(). Vedi sotto un esempio di esempio.
import java.util.*;
public class CollDemo
{
public static void main(String[] argv) throws Exception
{
List stuff = Arrays.asList(new String[] { "a", "b" });
List list = new ArrayList(stuff);
list = Collections.unmodifiableList(list);
Set set = new HashSet(stuff);
set = Collections.unmodifiableSet(set);
Map map = new HashMap();
map = Collections.unmodifiableMap(map);
System.out.println("Collection is read-only now.");
}
}
0
passare l'oggetto di raccolta per il suo equivalente funzionalità immodificabile di Collezioni classe codice seguente mostra l'uso di unmodifiableList
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Temp {
public static void main(String[] args) {
List<Integer> objList = new ArrayList<Integer>();
objList.add(4);
objList.add(5);
objList.add(6);
objList.add(7);
objList = Collections.unmodifiableList(objList);
System.out.println("List contents " + objList);
try {
objList.add(9);
} catch(UnsupportedOperationException e) {
e.printStackTrace();
System.out.println("Exception occured");
}
System.out.println("List contents " + objList);
}
}
stesso modo è possibile creare altre collezioni immodificabile così
- Collezioni .unmodifiableMap (mappa);
- Collections.unmodifiableSet (set);
"... e utilizzare solo la lista restituita, e mai l'originale' ArrayList' "è un'aggiunta molto importante qui! Passare il 'ArrayList' a quel metodo non cambia magicamente l'oggetto. Restituisce solo un involucro non modificabile. –
@Joachim Sauer - ottimo punto! –
A volte si desidera mantenere l'originale 'ArrayList'. Questa può essere una tecnica eccellente per esporre una vista simile a un elenco di dati incapsulati all'interno di un oggetto. Le modifiche all'oggetto aggiorneranno la vista 'List', ma la vista stessa non accetta alcuna modifica. – Matthew