Google collection LibraryのImmutableMapをどう使いこなすか?
Mapを戻り値とするメソッド内で生成することだろう。とにかく動作を見てみようと思う。
Map<String,Integer> map = new ImmutableMap.Builder<String,Integer>()
.put("a",10)
.put("b",20)
.build();
for(String key : map.keySet()){
System.out.println(key+" --> "+map.get(key));
}
try{
map.put("c",30);
}catch(UnsupportedOperationException e){
e.printStackTrace();
}
//
Map<String,Integer> map2 = new HashMap<String,Integer>();
map2.put("A",1);
map2.put("B",2);
map2.put("C",3);
// putAll を利用して既存Map からImmutableMapを生成
Map<String,Integer> map3 = new ImmutableMap.Builder<String,Integer>().putAll(map2).build();
for(String key : map3.keySet()){
System.out.println(key+" --> "+map3.get(key));
}
put を行うと RuntimeException を継承したUnsupportedOperationExceptionが発生する。
DBから読み取った内容を、putAll で登録してMapを返すメソッドなんてのも
良いかもしれない。
------------------------------
以下も参考に、、
ImmutableMap.Builder<String,Integer> ib = new ImmutableMap.Builder<String,Integer>();
ib.put("aa",11);
ib.put("bb",12);
ib.put("cc",12);
Map<String,Integer> map4 = ib.build();
for(String key : map4.keySet()){
System.out.println(key+" --> "+map4.get(key));
}
----------------------------------------------
import com.google.common.collect.ImmutableMap;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
public class Sample{
public static void main(String[] args){
Injector injector = Guice.createInjector(new AbstractModule(){
@Override
protected void configure(){
binder().bind(new TypeLiteral<ImmutableMap.Builder<String,Integer>>(){})
.toInstance(new ImmutableMap.Builder<String,Integer>());
}
}
);
Foo f = injector.getInstance(Foo.class);
Map<String,Integer> map = f.exec();
for(String key : map.keySet()){
System.out.println(key+" --> "+map.get(key));
}
}
static class Foo{
private ImmutableMap.Builder<String,Integer> ibuilder;
@Inject
public Foo(ImmutableMap.Builder<String,Integer> ibuilder){
this.ibuilder = ibuilder;
ibuilder.put("a",1);
ibuilder.put("b",2);
}
public Map<String,Integer> exec(){
return this.ibuilder.build();
}
}
}