Come inizializzereste una Map
statica in Java?
Metodo uno: inizializzatore statico Metodo due: inizializzatore di istanza (sottoclasse anonima) o qualche altro metodo?
Quali sono i pro e i contro di ciascuno?
Ecco un esempio che illustra i due metodi:
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'inizializzatore di istanza è solo zucchero sintattico in questo caso, giusto? Non vedo perché avete bisogno di una classe anonima in più solo per inizializzare. E non funzionerà se la classe creata è finale.
Puoi creare una mappa immutabile usando anche un inizializzatore statico:
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 vantaggio del secondo metodo è che puoi avvolgerlo con Collections.unmodifiableMap()
per garantire che nulla aggiornerà la collezione in seguito:
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!