Como posso rubricar um mapa estático?

Como você iniciaria um Mapa estático em Java?

Método um: iniciador estático
Método dois: iniciador de instância (subclasse anônima) ou algum outro método?

Quais são os prós e os contras de cada um?

Aqui está um exemplo que ilustra os dois 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");
        }
    };
}
Solução

O iniciador de instância é apenas açúcar sintáctico neste caso, certo? Não vejo porque precisas de uma aula anónima extra só para inicializar. E não vai funcionar se a turma que está a ser criada for final.

Você pode criar um mapa imutável usando um inicializador estático também:

public class Test {
    private static final Map myMap;
    static {
        Map aMap = ....;
        aMap.put(1, "one");
        aMap.put(2, "two");
        myMap = Collections.unmodifiableMap(aMap);
    }
}
Comentários (9)

Uma vantagem para o segundo método é que você pode envolvê-lo com Collections.unmodifiableMap() para garantir que nada irá atualizar a coleção mais tarde:

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!
Comentários (4)

O segundo método poderia invocar métodos protegidos, se necessário. Isto pode ser útil para inicializar classes que são imutáveis após a construção.

Comentários (0)