Multibindings, MapBindings
Google Guice 2.0がリリースされたました!ということで、新機能を少しずつ試してみることにします。まずは、Multibindings と MapBindings。
機能
Multibindings,MapBindings は登録した複数のコンポーネントを、SetやMapで取得 or Injectする機能です。ContainerJSにおけるgetsみたいなものと理解(←わかりにくい)。
Setで取り出すサンプル
Injector injector = Guice.createInjector( new AbstractModule(){ protected void configure() { // 文字列のSetを登録するサンプル。 Multibinder<String> binder = Multibinder.newSetBinder( binder(), String.class ); binder.addBinding().toInstance( "mii" ); binder.addBinding().toInstance( "tora" ); binder.addBinding().toInstance( "shiro" ); } }); // 登録されたSetは、Set<String>型をキーとして取り出せる。 Set<String> kittens = injector.getInstance( Key.get( new TypeLiteral<Set<String>>(){}) ); for ( String kitten : kittens ) System.out.println( kitten );
実行結果です。
mii tora shiro
Mapで取り出すサンプル
Injector injector = Guice.createInjector( new AbstractModule(){ protected void configure() { // 文字列をキーとするIntegerのMapを登録するサンプル。 MapBinder<String,Integer> binder = MapBinder.newMapBinder( binder(), String.class, Integer.class ); binder.addBinding( "mii" ).toInstance( 1 ); binder.addBinding( "tora" ).toInstance( 2 ); binder.addBinding( "shiro" ).toInstance( 3 ); } }); Map<String,Integer> kittens = injector.getInstance( Key.get( new TypeLiteral<Map<String,Integer>>(){}) ); for ( Map.Entry<String,Integer> kitten : kittens.entrySet() ) { System.out.println( kitten.getKey() + " : " + String.valueOf( kitten.getValue() ) ); }
実行結果です。
mii : 1 tora : 2 shiro : 3
TypeLiteralも使えます。
final TypeLiteral<Comparator<Integer>> type = new TypeLiteral<Comparator<Integer>>(){}; Injector injector = Guice.createInjector( new AbstractModule(){ protected void configure() { // TypeLiteralで指定するAPIもあるので、型パラメータ付きのクラスのSetも登録可能。 Multibinder<Comparator<Integer>> binder = Multibinder.newSetBinder( binder(), type ); binder.addBinding().toInstance( new Comparator<Integer>() { public int compare ( Integer o1, Integer o2 ) { return 0; } @Override public String toString() { return "test"; } } ); } }); Set<Comparator<Integer>> set = injector.getInstance( Key.get( new TypeLiteral<Set<Comparator<Integer>>>(){}) ); for ( Comparator<Integer> c : set ) System.out.println( c );
実行結果です。
test