¿Cómo puedo inicializar un Mapa estático?

¿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");
        }
    };
}
Solución

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 myMap;
    static {
        Map aMap = ....;
        aMap.put(1, "one");
        aMap.put(2, "two");
        myMap = Collections.unmodifiableMap(aMap);
    }
}
Comentarios (9)

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 CONSTANT_MAP = 
    Collections.unmodifiableMap(new HashMap() {{ 
        put(1, "one");
        put(2, "two");
    }});

 // later on...

 CONSTANT_MAP.put(3, "three"); // going to throw an exception!
Comentarios (4)

El segundo método podría invocar métodos protegidos si fuera necesario. Esto puede ser útil para inicializar clases que son inmutables después de la construcción.

Comentarios (0)