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