@ Singleton VS static dagger2で提供されるものの違いを知っていますか?
@Provides static User currentUser(AuthManager authManager) {
return authManager.currentUser();
}
@Provides @Singleton User currentUser(AuthManager authManager) {
return authManager.currentUser();
}
これらは非常に異なる属性であり、どちらか一方を個別に持つことができます。これらはすべて有効です。
@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}
ステージを設定するために、@Provides User
メソッドは、「このコンポーネントまたはその依存関係について、ユーザーが必要になるたびにこの@Providesメソッドを呼び出します」と言います。通常、メソッドは毎回新しいインスタンスを返し、Daggerはインスタンスを保存またはキャッシュしません。
@Singleton
はscopeの例です。これは、ライフサイクルポリシーまたは新しいインスタンスを作成する頻度に関するポリシー。 @Provides @Singleton User
は、「このコンポーネントまたは依存関係については、この@Providesメソッドを1回呼び出して、結果を保存するだけです」と述べています。 @Singleton
はたまたま組み込みの一般的なケースですが、@UserScope
(常にこのユーザーに対して同じインスタンスを返す)またはAndroid @FragmentScope
または@ActivityScope
。
特定のケースでは、@Singleton
はおそらく必要ありません。これは、コンポーネントにsaveまたはcacheを指示するためです。 )AuthManagerからの値。ユーザー値がアプリケーションの存続期間中に変更される可能性がある場合、コンポーネントはそれを反映しません。 (その場合、更新されないUser
ではなく、更新されるProvider<User>
を注入することも忘れないでください。)
スコープをしばらく残しておくと、static
はJavaで期待されるとおりに動作します。メソッドがインスタンス状態を必要としない場合は、static
と仮想マシンを作成できます。マシンは、インスタンスの状態を準備せずにそれを呼び出すことができます。生成されたコンポーネントの実装では、Daggerは自動的にstatic
メソッドを静的に呼び出し、コンポーネントに渡すModuleインスタンスのインスタンスメソッドを呼び出します。 in Androidこれにより、パフォーマンスが大幅に向上します。currentUser
メソッドでインスタンス状態を使用しないため、簡単にstatic
にすることができます。
参考文献:
@Singleton
アノテーションアプリケーションのライフサイクル全体で、Userオブジェクトのインスタンスが1つだけ作成されます。
static
on @Provides
最近導入されたメソッドは、前述のようにメソッドの呼び出しを15〜20%高速化します ここ 。このメソッドを複数回呼び出すと、Userオブジェクトのインスタンスが複数存在します。