Comment initialiser un Map
statique en Java ?
Première méthode : initialisation statique
Deuxième méthode : initialisation d'instance (sous-classe anonyme)
ou
une autre méthode ?
Quels sont les avantages et les inconvénients de chacune ?
Voici un exemple illustrant les deux méthodes :
import java.util.HashMap;
import java.util.Map;
public class Test {
private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
static {
myMap.put(1, "one");
myMap.put(2, "two");
}
private static final Map<Integer, String> myMap2 = new HashMap<Integer, String>(){
{
put(1, "one");
put(2, "two");
}
};
}
L'initialisateur d'instance est juste un sucre syntaxique dans ce cas, n'est-ce pas ? Je ne vois pas pourquoi vous avez besoin d'une classe anonyme supplémentaire juste pour initialiser. Et cela ne fonctionnera pas si la classe créée est finale.
Vous pouvez aussi créer une carte immuable en utilisant un initialisateur statique :
public class Test {
private static final Map<Integer, String> myMap;
static {
Map<Integer, String> aMap = ....;
aMap.put(1, "one");
aMap.put(2, "two");
myMap = Collections.unmodifiableMap(aMap);
}
}
Un avantage de la deuxième méthode est que vous pouvez l'envelopper avec Collections.unmodifiableMap()
pour garantir que rien ne va mettre à jour la collection plus tard :
private static final Map<Integer, String> CONSTANT_MAP =
Collections.unmodifiableMap(new HashMap<Integer, String>() {{
put(1, "one");
put(2, "two");
}});
// later on...
CONSTANT_MAP.put(3, "three"); // going to throw an exception!