¿Cómo se inicializa un Map
estático en Java?
Método uno: inicializador estático Método dos: inicializador de instancia (subclase anónima) o algún otro método?
¿Cuáles son los pros y los contras de cada uno?
Aquí tienes un ejemplo que ilustra los dos métodos:
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");
}
};
}
El inicializador de instancia es sólo azúcar sintáctico en este caso, ¿no? No veo por qué necesitas una clase anónima adicional sólo para inicializar. Y no funcionará si la clase que se crea es final.
Puedes crear un mapa inmutable usando un inicializador estático también:
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);
}
}
Una ventaja del segundo método es que puedes envolverlo con Collections.unmodifiableMap()
para garantizar que nada va a actualizar la colección después:
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!