[英]Dagger 2 lazy initialize map entries
我有一個 Dagger 模塊和組件定義如下。 我只想在從地圖中獲取資源時而不是在服務出現時在模塊中創建資源。 我玩過使用 Lazy 但不知道如何實現這一點。
@Module
public abstract class ExpensiveObjectModule {
@Singleton
@Provides
@IntoMap
@UniqueKey(Key.A)
static ExpensiveObject provideKeyAExpensiveObject() {
return new ExpensiveObject(Key.A);
}
@Singleton
@Provides
@IntoMap
@UniqueKey(Key.B)
static ExpensiveObject provideKeyBExpensiveObject() {
return new ExpensiveObject(Key.B);
}
}
@Singleton
@Component (modules = {
ExpensiveObjectModule.class
})
public interface HandlerComponent {
Map<Key, ExpensiveObject> getExpensiveObjectByKey();
}
handlerComponent.getExpensiveObjectByKey().get(key);
每當您可以注入A
您也可以注入Provider<A>
,因此您可以擁有Map<K, Provider<A>>
,而不是Map<K, A>
。 Lazy 可能也是如此,但是 Provider 會尊重某物的任何作用域,而 Lazy 總是會緩存它。
所以你可以像這樣返回地圖:
Map<Key, Provider<ExpensiveObject>> getExpensiveObjectByKey();
一個最小的例子(但在 Kotlin 中)如下所示:
@MustBeDocumented
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class Key(val value: String)
@Module
object ModFoo {
@Provides
@IntoMap
@Key("foo")
fun foo(): Any = "Foo"
@Provides
@IntoMap
@Key("bar")
fun bar(): Any = 3
}
@Component(modules = [ModFoo::class])
interface Foo {
val foo: Map<String, Any>
val fooProviders: Map<String, Provider<Any>>
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.