無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

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

名前付きバインディング

Guice組み込みのNamedアノテーションを利用して、サービスインターフェイスと実装を名前付きで関連づけます。

  1. Moduleで「インターフェイス+名前」と、実装を関連づけ。(Names#namedはNamedアノテーションを生成するユーティリティです。)
  2. インスタンス取得時も同様に、「インターフェイス+名前」を指定して実装を取得します。

サービスのインターフェイス:

import com.google.inject.ImplementedBy;

/**
 * サービスのインターフェイス
 */
interface Kitten {
    void meow ();
}

サービスの実装:

/**
 * サービスの実装
 */
class KittenImpl implements Kitten {
    final String name;
    KittenImpl ( String name ) {
        this.name = name;
    }
    public void meow () {
        System.out.println( name + " : meow!" );
    }
}

利用サンプル:

Injector injector = Guice.createInjector( new AbstractModule() {
    @Override
    protected void configure ( ) {
        // 名前付きで登録
        bind( Key.get( Kitten.class, Names.named( "mii" ) ) )
            .toInstance( new KittenImpl("mii") );
        bind( Key.get( Kitten.class, Names.named( "kuro" ) ) )
            .toInstance( new KittenImpl("kuro") );
    }
});

// 型と名前を指定して取得。
Kitten mii = injector.getInstance(
    Key.get( Kitten.class, Names.named( "mii" ) ) );
mii.meow();

Kitten kuro = injector.getInstance(
    Key.get( Kitten.class, Names.named( "kuro" ) ));
kuro.meow();

出力:

mii : meow!
kuro : meow!

名前付きのインスタンスのインジェクション

名前付きのインスタンスをインジェクションする場合は、インジェクション先にNamedアノテーションを記述します。Namedアノテーションの属性として「名前」を指定します。

インジェクション先:

import com.google.inject.Inject;
import com.google.inject.name.Named;

public class Master {

    // インジェクション先のフィールド
    // "mii"の名前付きKittenがインジェクションされる。
    @Inject @Named("mii") Kitten mii;

    // メソッドインジェクションされるフィールド
    Kitten kuro;

    // インジェクション用メソッド
    // "kuro"の名前付きKittenがインジェクションされる。
    @Inject void setKuro( @Named("kuro") Kitten kuro ) {
        this.kuro = kuro;
    }

    public void call () {
        mii.meow();
        kuro.meow();
    }
}

利用サンプル:

Injector injector = Guice.createInjector( new AbstractModule() {
    @Override
    protected void configure ( ) {
        // 名前付きで登録
        bind( Key.get( Kitten.class, Names.named( "mii" ) ) )
            .toInstance( new KittenImpl("mii") );
        bind( Key.get( Kitten.class, Names.named( "kuro" ) ) )
            .toInstance( new KittenImpl("kuro") );
    }
});
injector.getInstance(Master.class).call();

出力:

mii : meow!
kuro : meow!

追記 (07-05-22)

Namedアノテーションを利用した方法はGuiceでは推奨されていません。(→ Java on Guice Guice 1.0 User's Guideの Binding to Strings の項を参照)

  • スペルミスをしがち
  • 開発ツールに優しくない

という理由で、独自にアノテーションを作成して名前を付ける方法が推奨されています。でも、どう考えてもめんどい気が。(という人のためにNamedが用意されているみたいですが。)