web-dev-qa-db-ja.com

ダガー2で異なる@Singletonとstatic @ Provides

@ Singleton VS static dagger2で提供されるものの違いを知っていますか?

@Provides static User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

@Provides @Singleton User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}
20
Shawn Thye

これらは非常に異なる属性であり、どちらか一方を個別に持つことができます。これらはすべて有効です。

@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}

ステージを設定するために、@Provides Userメソッドは、「このコンポーネントまたはその依存関係について、ユーザーが必要になるたびにこの@Providesメソッドを呼び出します」と言います。通常、メソッドは毎回新しいインスタンスを返し、Daggerはインスタンスを保存またはキャッシュしません。

@Singletonscopeの例です。これは、ライフサイクルポリシーまたは新しいインスタンスを作成する頻度に関するポリシー@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にすることができます。

参考文献:

32
Jeff Bowman

@Singletonアノテーションアプリケーションのライフサイクル全体で、Userオブジェクトのインスタンスが1つだけ作成されます。

static on @Provides最近導入されたメソッドは、前述のようにメソッドの呼び出しを15〜20%高速化します ここ 。このメソッドを複数回呼び出すと、Userオブジェクトのインスタンスが複数存在します。

3
shekar