Il modo migliore per creare una mappa vuota in Java
-
10-07-2019 - |
Domanda
Devo creare una mappa vuota.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
Il problema è che il codice precedente produce questo avviso: Sicurezza del tipo: cast non selezionato da Mappa a HashMap
Qual è il modo migliore per creare questa mappa vuota?
Soluzione
1) Se la mappa può essere immutabile:
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
Dovrai usare quest'ultimo a volte quando il compilatore non riesce a capire automaticamente quale tipo di Mappa è necessaria (questo si chiama tipo inferenza ). Ad esempio, considera un metodo dichiarato come questo:
public void foobar(Map<String, String> map){ ... }
Quando passi la Mappa vuota direttamente ad essa, devi essere esplicito sul tipo:
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2) Se devi essere in grado di modificare la mappa, ad esempio:
new HashMap<String, String>()
(come tehblanx sottolineato )
Addendum : se il tuo progetto utilizza Guava , hai le seguenti alternative:
1) Mappa immutabile:
ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
Concesso, nessun grande vantaggio qui rispetto a Collections.emptyMap()
. Da il Javadoc :
Questa mappa si comporta e si comporta in modo comparabile a
Maps
, ed è preferibile principalmente per la coerenza e la manutenibilità del tuo codice.
2) Mappa che puoi modificare:
Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
TreeMap
contiene metodi di fabbrica simili per l'istanza anche di altri tipi di mappe, come LinkedHashMap
o <=> .
Aggiornamento (2018) : su Java 9 o più recente, il codice più breve per creare una mappa vuota immutabile è:
Map.of()
... utilizzando il nuovo metodi di convenienza da 269 JEP . & # 128526;
Altri suggerimenti
Se hai bisogno di un'istanza di HashMap, il modo migliore è:
fileParameters = new HashMap<String,String>();
Dato che Map è un'interfaccia, è necessario selezionare una classe che la crea un'istanza se si desidera creare un'istanza vuota. HashMap sembra buono come qualsiasi altro - quindi basta usare quello.
O Collections.emptyMap()
o se l'inferenza del tipo non funziona nel tuo caso,
Collections.<String, String>emptyMap()
Poiché in molti casi viene utilizzata una mappa vuota per la progettazione null-safe, è possibile utilizzare il metodo di utilità nullToEmpty
:
class MapUtils {
static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
if (map != null) {
return map;
} else {
return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
}
}
}
Allo stesso modo per i set:
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
ed elenchi:
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}