java - programacion - keeptoo
La mejor forma de crear un mapa vacío en Java (7)
Necesito crear un mapa vacío.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
El problema es que el código anterior produce esta advertencia: Tipo de seguridad: conversión no verificada de Mapa a HashMap
¿Cuál es la mejor manera de crear este mapa vacío?
Como en muchos casos se usa un mapa vacío para un diseño nulo, puede utilizar el método de utilidad 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()
}
}
}
Del mismo modo para conjuntos:
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
y listas:
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}
Qué pasa :
Si necesita una instancia de HashMap, la mejor manera es:
fileParameters = new HashMap<String,String>();
Dado que Map es una interfaz, debe elegir una clase que la ejemplifique si desea crear una instancia vacía. HashMap parece tan bueno como cualquier otro, así que solo use eso.
Ya sea Collections.emptyMap()
, o si la inferencia de tipo no funciona en su caso,
Collections.<String, String>emptyMap()
1) Si el mapa puede ser inmutable:
Collections.emptyMap();
// or, in some cases:
Collections.<String, String>emptyMap();
Tendrás que usar este último a veces cuando el compilador no puede determinar automáticamente qué tipo de Mapa se necesita (esto se llama inferencia de tipo ). Por ejemplo, considere un método declarado así:
public void foobar(Map<String, String> map){ ... }
Al pasar el Mapa vacío directamente a él, debe ser explícito sobre el tipo:
foobar(Collections.emptyMap()); // doesn''t compile
foobar(Collections.<String, String>emptyMap()); // works fine
2) Si necesita poder modificar el Mapa, entonces por ejemplo:
new HashMap<String, String>();
(como tehblanx señaló )
Adición : si su proyecto usa Guava , tiene las siguientes alternativas:
1) Mapa inmutable:
ImmutableMap.of();
// or:
ImmutableMap.<String, String>of();
De acuerdo, no hay grandes beneficios aquí en comparación con Collections.emptyMap()
. Desde el Javadoc :
Este mapa se comporta de manera comparable a
Collections.emptyMap()
, y es preferible principalmente por la coherencia y la facilidad de mantenimiento de su código.
2) Mapa que puedes modificar:
Maps.newHashMap();
// or:
Maps.<String, String>newHashMap();
Maps
contiene métodos de fábrica similares para crear otros tipos de mapas, como TreeMap
o LinkedHashMap
.