Melhor maneira de criar um mapa vazio em Java
-
10-07-2019 - |
Pergunta
Eu preciso para criar um mapa vazio.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
O problema é que o código acima produz o seguinte aviso: Tipo de segurança: elenco não verificada a partir de Mapa para HashMap
O que é a melhor maneira de criar esse mapa vazio?
Solução
1) Se o mapa pode ser imutável:
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
Você terá que usar este último às vezes, quando o compilador não pode determinar automaticamente o tipo de mapa é necessário (isso é chamado de inferência de tipos ). Por exemplo, considere um método declarado como este:
public void foobar(Map<String, String> map){ ... }
Ao passar o vazio Mapa diretamente a ele, você tem que ser explícito sobre o tipo:
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2) Se você precisa ser capaz de modificar o mapa, em seguida, por exemplo:
new HashMap<String, String>()
(como tehblanx apontou )
Adenda : Se os seus usos do projeto Goiaba , você tem as seguintes alternativas:
1) mapa Imutável:
ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
Com certeza, há grandes benefícios aqui em comparação com Collections.emptyMap()
. De o Javadoc :
Este mapa se comporta e executa comparavelmente para
Collections.emptyMap()
, e é preferível principalmente para a consistência e capacidade de manutenção do seu código.
2) Mapa que você pode modificar:
Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
Maps
contém métodos de fábrica semelhantes para instanciar outros tipos de mapas, bem como, tais como TreeMap
ou LinkedHashMap
.
Update (2018) : On Java 9 ou mais recente, o código mais curto para a criação de um mapa vazio imutável é:
Map.of()
... usando a nova métodos de fábrica de conveniência de PEC 269 . ??
Outras dicas
Se você precisar de uma instância de HashMap, a melhor maneira é:
fileParameters = new HashMap<String,String>();
Desde Mapa é uma interface, você precisa escolher alguma classe que instancia-lo se você deseja criar uma instância vazia. HashMap parece tão bom quanto qualquer outro -. Por isso só usar esse
De qualquer Collections.emptyMap()
, ou se a inferência de tipos não funciona no seu caso,
Collections.<String, String>emptyMap()
Uma vez que, em muitos casos um mapa vazio é usado para projeto nulo-safe, você pode utilizar o método de utilitário 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()
}
}
}
Da mesma forma para os conjuntos:
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
e listas:
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}