読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Multibindings, MapBindings

Java Guice

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