有没有办法将几个实例绑定到 Guice 中的许多不同键?

Is there a way to bind a couple of instances to many different keys in Guice?

我们需要在一些对象的多种类型之间创建一些映射,用枚举值描述:

public enum ObjectType {
Type1,Type2,Type3,Type4,Type5...TypeN
}

...和

  1. 用于这些类型的几个策略实例
  2. 或者,例如,与提到的对象类型相关的布尔值

Guice 的 MapBinder、标准的 HashMap 以及来自 google 个集合的一些复杂映射可用于此目的。

我想要的是找到适合这场比赛 "values" 的 "low-density" 结构的东西。我想看到像

这样的东西
binder.addBinding(ObjectType.Type1,ObjectType.Type2...ObjectType.Type6).toInstance(Boolean.TRUE)
or
binder.addBinding(ObjectType.Type1,ObjectType.Type2...ObjectType.Type6).toInstance(new SomeStrategyForFirstSixObjectType())

有什么建议吗?

最简单的方法是遍历值:

for (ObjectType type : ObjectType.values()) {
  // Assumes you've created a binding annotation @YourAnnotation(ObjectType) along
  // with an implementation called YourAnnotationImpl.
  bind(Boolean.class)
      .annotatedWith(new YourAnnotationImpl(type))
      .toInstance(Boolean.TRUE));

  // Now you can inject "@YourAnnotation(Type1) Boolean yourValue" and so on.
}

但是,尽管对于某些用途来说这可能有意义,但您可能不希望为 Guice 中的每个值都使用单独的布尔值绑定——尤其是在绑定多个相关值时。相反,您可能会考虑将所有内容收集到一个 TypeConfiguration(例如)中,您可以按上述方式绑定每个类型,并在测试中用 FakeTypeConfiguration 替换。

你也可以把所有的东西都收集起来然后绑定成一个 Map:

bind(new TypeLiteral<Map<ObjectType, Boolean>> {})
    .toInstance(ImmutableMaps.<ObjectType, Boolean>newBuilder()
        .add(Type1, TRUE)
        .add(Type2, TRUE)
        // [snip, you could replace with a for-loop or pre-built map]
        .build());

// Now you can inject "Map<ObjectType, Boolean>".