如何在匕首中创建地图的值

use*_*383 3 java dagger

在我的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);
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是正确的方法,最好的做法是什么.

Epi*_*rce 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);
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但是如果你不知道你需要Map中的每个`Action`实例,你可能更喜欢`Map <SomeEnum,Provider <Action >>来节省一些创建/收集成本. (2认同)