Ako by ste inicializovali statickú Map
v Jave?
Prvá metóda: statický inicializátor
Druhá metóda: inštančný inicializátor (anonymná podtrieda)
alebo
nejaká iná metóda?
Aké sú výhody a nevýhody každej z nich?
Tu je príklad ilustrujúci tieto dve metódy:
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");
}
};
}
Inicializátor inštancie je v tomto prípade len syntaktický cukor, však? Nechápem, prečo potrebujete ďalšiu anonymnú triedu len na inicializáciu. A nebude to fungovať, ak je vytváraná trieda finálna.
Nemennú mapu môžete vytvoriť aj pomocou statického inicializátora:
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);
}
}
Jednou z výhod druhej metódy je, že ju môžete obaliť pomocou funkcie Collections.unmodifiableMap()
a zaručiť tak, že kolekciu neskôr nič neaktualizuje:
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!