Android+Guice その4

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

前回説明したSingletonの初期化タイミングの制御について。Stageについての説明です。

今までInjectorを作るのにGuice.createInjector(new OkinawaModule());で作っていましたが更にStageを指定する事が可能です。

あとStage.TOOLというのもありますが、これはInjectionをしないモードなのでここでは扱いません。

DEVELOPMENTではStartup時間を早くするように動作し、PRODUCTIONではStartup時間は長くなるけどPerformanceが良くなる様に動作します。って事みたいです(^_^;)。

何はともあれ動作を見ましょう。以下のように書き換えてServiceImplが作成されたタイミングでメッセージを出力するようにします。

StageをPRODUCTIONにします。

これで実行してみます。Stage.PRODUCTIONです。

DEVELOPMENTステージに変更して実行します。

ServiceImplのインスタンスが作成されたタイミングが変わったのが分かるかと思います。GuiceではSingletonの初期化方法が二種類あってそれぞれタイミングが違うために起こります。

この二種類のSingleton(の初期化)はEager Singleton と Lazy Singletonと呼ばれています。

簡単に説明すると、要求されるまでオブジェクトを作らないLazyと要求される前に予め作っておくEagerという事です。

DEVELOPMENT Stageでは出来るだけLazyにして開始時間を短縮し(これによりCompile→Runという流れを速くします)、PRODUCTIONではEagerで作成しておいて利用される場面で高速に動作するように動きます。

Stage.DEVELOPMENTでも事前作成にしたいSingletonがある場合はbindする時に.asEagerSingleton()とする事で事前に作る事が可能です。

これでDEVELOPMENT StageでもInjectorが作成されたタイミングでSingletonが作成されます。

次回は再度Injectionの方法について。

…うーん、なかなかAndroid上で試すところまで到達しないな(笑)