Android+Guice その5

※2012・10 こちらのページにまとめるようにしてみました。

さて、今回はInjectの仕方についてです。

前回までは特に何も考えずPrivate Fieldに対して@InjectアノテーションでInjectを指示してきました。

この場合Default Constructorでオブジェクトが作成された後にPrivate Fieldに対してInjectionが行われます。

というわけでConstructorによるInjection。

例えばprivate finalなfieldを使いたい場合はConstructorで設定しないと問題になります。こういう場合はConstructorに対して@Injectアノテーションを付けてConstructorの呼び出し時に注入を行います。

この場合Injector側でオブジェクトを作成するときにDefault Constructorではなく、パラメータ付のConstructorが呼び出されてInjectionされる事になります。

続いてMethodによるInjection。

PropertyのSetterが副作用を持つ場合等はFieldに直接注入するのではなくSetterの呼び出しでInjectionしたくなります。もう予想ついてると思いますが、こういう場合は以下。

これらのField/Constructor/Method Injectionは併用できますので必要に応じてInjectionの仕方を変更する事が可能です。

余談

ここで疑問が一つ。Constructorは問答無用で一番最初にInjectionされる事になりますが、FieldとMethodのどちらが先でしょう? 簡単な実験ではConstructor→Field→Methodの順番でした。ただ、これが普遍的にそうなのかどうかはソース読むしかない気もします:-)

まぁ、当たり前ですが順番に依存するような実装は避けるべきでしょう(^_^;)。

さて次回は注入するObjectの作成が簡単ではない場合、Provides Methodsの使い方。

Providerまで書き終わったらAndroidに組み込んでみよう。やっと(^_^;)