Hvordan vil du initialisere et statisk "kart" i Java?
Metode en: statisk initialisator
Metode to: instansinitialisator (anonym underklasse)
eller
en annen metode?
Hva er fordelene og ulempene med hver av dem?
Her er et eksempel som illustrerer de to metodene:
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");
}
};
}
Instansen initialiser er bare syntaktisk sukker i dette tilfellet, ikke sant? Jeg kan ikke se hvorfor du trenger en ekstra anonym klasse bare for å initialisere. Og det vil ikke fungere hvis klassen som opprettes er endelig.
Du kan opprette et uforanderlig kart ved hjelp av en statisk initialisator også:
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);
}
}
En fordel med den andre metoden er at du kan pakke den inn med Collections.unmodifiableMap()
for å garantere at ingenting kommer til å oppdatere samlingen senere:
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!