ImmutableMapの動作

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();
      }
   }
}