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

时间:2015-06-02 10:57:15

标签: java collections guava guice

我们需要在某些对象之间创建一些映射,用枚举值描述:

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

...和

  1. 用于这些类型的策略的几个实例
  2. 或者,例如,与提到的ObjectTypes相关的布尔值
  3. 来自Guice的MapBinder可用于此目的,还有一个标准的HashMap,以及来自google集合的一些复杂地图。

    我想要的是找到适合这种匹配“价值”的“低密度”结构的东西。我希望看到像

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

    有什么建议吗?

1 个答案:

答案 0 :(得分:0)

最简单的方法是遍历值:

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>".