Java で static Map
を初期化するには?
方法1:スタティックイニシャライザ
方法2:インスタンスイニシャライザ(匿名サブクラス)
または
他の方法は?
それぞれの長所と短所を教えてください。
ここでは、2つの方法の例を示します。
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");
}
};
}
この場合、インスタンス・イニシャライザは単なる構文上の糖でしかありませんよね。初期化のためだけに余計な匿名クラスを必要とする理由がわかりません。また、作成されるクラスがfinalである場合には動作しません。
静的イニシャライザを使って不変のマップを作ることもできます。
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);
}
}
2つ目の方法の利点は、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!