web-dev-qa-db-fra.com

Meilleure façon de créer une carte vide dans Java

J'ai besoin de créer une carte vide.

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

Le problème est que le code ci-dessus génère cet avertissement: Type safety: transtypage non contrôlé de Map to HashMap

Quel est le meilleur moyen de créer cette carte vide?

101
JorgeO

1) Si la carte peut être immuable:

Collections.emptyMap()

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

Vous devrez utiliser ce dernier parfois lorsque le compilateur ne peut pas déterminer automatiquement quel type de carte est nécessaire (cela s'appelle type inference ). Par exemple, considérons une méthode déclarée comme ceci:

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

Lorsque vous passez directement la carte vide à celle-ci, vous devez être explicite sur le type:

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

2) Si vous avez besoin de pouvoir modifier la carte, alors par exemple:

new HashMap<String, String>()

(comme tehblanx a souligné )


Addendum : Si votre projet utilise Goyave , vous avez les alternatives suivantes:

1) Carte immuable:

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

Certes, pas de gros avantages par rapport à Collections.emptyMap(). du Javadoc :

Cette carte se comporte et fonctionne de manière comparable à Collections.emptyMap(), et est préférable principalement pour la cohérence et la maintenabilité de votre code.

2) Carte que vous pouvez modifier:

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

Maps contient des méthodes fabriques similaires pour instancier d'autres types de cartes, telles que TreeMap ou LinkedHashMap .


Mise à jour (2018) : le Java 9 ou plus récent, le code le plus court pour créer une carte vide immuable est:

Map.of()

... en utilisant le nouveau méthodes de confort en usine de JEP 269 . ????

207
Jonik
14
TofuBeer
14
basszero

Si vous avez besoin d'une instance de HashMap, le meilleur moyen est:

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

Comme Map est une interface, vous devez choisir une classe qui l'instancie si vous souhaitez créer une instance vide. HashMap semble aussi bon que n'importe quel autre, alors utilisez-le.

9
AndreiM

Soit Collections.emptyMap(), ou si l'inférence de type ne fonctionne pas dans votre cas,
Collections.<String, String>emptyMap()

7
Peter Štibraný

Comme dans de nombreux cas, une carte vide est utilisée pour une conception null-safe, vous pouvez utiliser la méthode d'utilitaire 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()
    }
  }

}  

De même pour les sets:

class SetUtils {

  static <T> Set<T> nullToEmpty(Set<T> set) {
    if (set != null) {
      return set;
    } else {
      return Collections.<T>emptySet();
    }
  }

}

et listes:

class ListUtils {

  static <T> List<T> nullToEmpty(List<T> list) {
    if (list != null) {
      return list;
    } else {
      return Collections.<T>emptyList();
    }
  }

}
2
Vitalii Fedorenko
1
OscarRyz