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?

Foi útil?

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top