2009-03-11 25 views
73

Necesito crear un mapa vacío.La mejor manera de crear un mapa vacío en Java

if (fileParameters == null) 
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP; 

El problema es que el código anterior produce esta advertencia: seguridad Tipo: Desactivada echa de Mapa de Hashmap

¿Cuál es la mejor manera de crear este mapa vacío?

+0

¿Cuál es su tipo declarado para fileParameters? – jjnguy

+0

Probablemente también obtenga una ClassCastException. –

+1

fileParameters debería ser un Mapa y no un HashMap. –

Respuesta

143

1) Si el mapa puede ser inmutable:

Collections.emptyMap(); 

// or, in some cases: 
Collections.<String, String>emptyMap(); 

Usted Tendrá que usar el último a veces cuando el compilador no puede determinar automáticamente qué tipo de mapa se necesita (esto se llama type inference). Por ejemplo, considere un método declarado como esto:

public void foobar(Map<String, String> map){ ... } 

Al pasar el Mapa vacía directamente a él, tiene que ser explícito acerca del tipo:

foobar(Collections.emptyMap());     // doesn't compile 
foobar(Collections.<String, String>emptyMap()); // works fine 

2) Si necesita ser capaz de modificar el Mapa, a continuación, por ejemplo:

new HashMap<String, String>(); 

(como tehblanx pointed out)


Adición: si su proyecto utiliza Guava, dispone de las siguientes alternativas:

1) mapa inmutable:

ImmutableMap.of(); 
// or: 
ImmutableMap.<String, String>of(); 

Por supuesto, no hay grandes beneficios aquí en comparación con Collections.emptyMap(). From the Javadoc:

Este mapa se comporta y un desempeño comparable a Collections.emptyMap(), y es preferible sobre todo para la consistencia y capacidad de mantenimiento de su código .

2) mapa que se puede modificar:

Maps.newHashMap(); 
// or: 
Maps.<String, String>newHashMap(); 

Maps contiene métodos de fábrica similares para crear instancias de otros tipos de mapas, así, como TreeMap o LinkedHashMap.

+0

En la mayoría de los casos, escriba inference works (es decir, map = Collections.emptyMap() funciona) –

+0

Sí, cierto. Edité la respuesta para ser un poco más completo. – Jonik

9

Si necesita una instancia de HashMap, la mejor manera es:

fileParameters = new HashMap<String,String>(); 

Desde mapa es una interfaz, es necesario recoger un poco de clase que instancia si desea crear una instancia vacía. HashMap parece tan bueno como cualquier otro, así que solo use eso.

13
+0

El problema es que este mapa solo se puede aplicar a un objeto Map no a un HashMap – JorgeO

+6

Debería (generalmente) evitar declarar objetos de sus tipos específicos y usar la interfaz (o el elemento primario abstracto) en su lugar. Intenta evitar "HashMap foo;" y use "Map foo;" en su lugar – TofuBeer

+0

+1 TofuBeer (si pudiera) –

6

De cualquier Collections.emptyMap(), o si la inferencia de tipos no funciona en su caso,
Collections.<String, String>emptyMap()

1

Dado que en muchos casos un mapa vacío se utiliza para el diseño nula de fallos, puede utilizar el método nullToEmpty utilidad:

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() 
    } 
    } 

} 

mismo modo para los 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(); 
    } 
    } 

} 
Cuestiones relacionadas