如何在Dagger中为Map创建值

3
在我的nano项目中,我决定用命令映射来替换大而丑陋的switch语句。现在我正在整理我的代码,并想创建一个提供已填充映射的提供程序。
我想知道最佳实践是什么。最初我考虑了以下内容:
@Provides 
ActionResolver provideActionResolver(Dependency dep1,Dependency dep2) {
  Map<SomeEnum,Action> map = new HashMap<>();
  map.put(SomeEnum.A1,new Action1(dep1);
  map.put(SomeEnum.A2,new Action2(dep2);
  return new ActionResolver(map);
}

我想知道是否有正确的方法并且什么是最佳实践。


2
你可能正在寻找Map Multibindings - EpicPandaForce
1个回答

5

使用Map Multibindings,如果我没理解错的话,你可以执行以下操作:

@MapKey
@interface SomeEnumKey {
    SomeEnum value();
}

@Provides 
@IntoMap
@SomeEnumKey(SomeEnum.A1)
Action action1(@Named("dep1") Dependency dep1) {
    return new Action1(dep1);
}

@Provides 
@IntoMap
@SomeEnumKey(SomeEnum.A2)
Action action2(@Named("dep2") Dependency dep2) {
    return new Action2(dep2);
}

@Provides 
ActionResolver provideActionResolver(Map<SomeEnum, Action> actions) {
    return new ActionResolver(actions);
}

2
+1,但如果您不知道您将需要地图中的每个Action实例,则可能更喜欢使用Map<SomeEnum,Provider<Action>>以节省一些创建/收集成本。 - Jeff Bowman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接