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に組み込んでみよう。やっと(^_^;)