Kako bi v Javi inicializirali statično mapo
?
Prva metoda: statični inicializator
Druga metoda: inicializator instance (anonimni podrazred)
ali
kakšna druga metoda?
Kakšne so prednosti in slabosti vsake od njih?
Tukaj je primer, ki ponazarja obe 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");
}
};
}
Inicializator primerkov je v tem primeru le sintaktični sladkor, kajne? Ne razumem, zakaj potrebujete dodaten anonimni razred samo za inicializacijo. In to ne bo delovalo, če je ustvarjeni razred končni.
Nespremenljiv zemljevid lahko ustvarite tudi z uporabo statičnega inicializatorja:
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);
}
}
Ena od prednosti druge metode je, da jo lahko ovijete z Collections.unmodifiableMap()
in tako zagotovite, da zbirke kasneje ne bo nič posodabljalo:
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!