Google Guiceを使う

Google Guiceとは、Dependency Injectionを実現するためのライブラリです。

Dependency Injectionを利用すると、プログラム同士の依存度が下がり、使い回しのしやすいプログラムが書けるようになります。

サンプル

public interface Hoge {
  public String test();
}
public class Fuga implements Hoge {
  public String test() { return "fuga"; }
}
public class TestInjector extends AbstractModule {
  @Override
  protected void configure() {
    bind(Hoge.class).to(Fuga.class);
  }
}
public class GuiceMain {
  private Hoge hoge;
  @Inject
  public GuiceMain(Hoge hoge) { this.hoge = hoge; }
  public String say() { System.out.println(hoge.test()); }
  public static void main(String[] args) {
    GuiceMain main = (new TestInjector()).getInstance(GuiceMain.class);
    main.say();
  }
}

これでGuiceMainを実行すると、以下のように出力されます。

fuga

簡単な説明

Injectorは、インスタンスを作成する処理の部分に実装クラスを記述することなしに実装を実現することを可能にします。

上のサンプルプログラムでいうと、

GuiceMain main = (new TestInjector()).getInstance(GuiceMain.class);

がインスタンス生成部分ですが、ここにはGuiceMainがコンストラクタに取るHogeの実装クラスであるFugaの指定がありません。

Guiceを利用しない場合、ここの記述は以下のようになるでしょう。

GuiceMain main = new GuiceMain(new Fuga());

Guiceの記述方法を利用すると、実装クラスFugaの登場場所はTestInjector.configure()内に移動し、実装クラスの記述を別ファイルに分離することができるわけです。

これによって、ソースコードの抽象度を向上させることができます。

参考