Как да инициализирате статична Map
в Java?
Първи метод: статичен инициализатор
Втори метод: инициализатор на инстанция (анонимен подклас)
или
някакъв друг метод?
Какви са предимствата и недостатъците на всеки от тях?
Ето един пример, който илюстрира двата метода:
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");
}
};
}
Инициализаторът на инстанцията е просто синтактична захар в този случай, нали? Не виждам защо ви е необходим допълнителен анонимен клас само за инициализация. И това няма да работи, ако създаваният клас е окончателен.
Можете да създадете неизменна карта, като използвате и статичен инициализатор:
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);
}
}
Едно от предимствата на втория метод е, че можете да го обвиете с Collections.unmodifiableMap()
, за да гарантирате, че нищо няма да актуализира колекцията по-късно:
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!
Вторият метод може да извиква защитени методи, ако е необходимо. Това може да бъде полезно за инициализиране на класове, които са неизменни след конструирането.