Java 有没有一种方法可以将几个实例绑定到Guice中的许多不同的键?

Java 有没有一种方法可以将几个实例绑定到Guice中的许多不同的键?,java,collections,guava,guice,Java,Collections,Guava,Guice,我们需要在一些对象的许多类型之间创建一些映射,用枚举值描述: public enum ObjectType { Type1,Type2,Type3,Type4,Type5...TypeN } 。。。及 用于这些类型的策略的几个实例 或者,例如,与提到的对象类型相关的布尔值 Guice的MapBinder可以用于此目的,还可以与standart HashMap以及google collections的一些复杂地图一起使用 我想要的是找到一些适合这种匹配的“低密度”结构的“价值观”。我想看看像这样

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

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

  • 用于这些类型的策略的几个实例
  • 或者,例如,与提到的对象类型相关的布尔值
  • Guice的MapBinder可以用于此目的,还可以与standart HashMap以及google collections的一些复杂地图一起使用

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

    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中的每个值都有单独的布尔绑定,尤其是在绑定多个相关值时。相反,您可以考虑将所有的内容集合到一个 Type EngFigue(例如)中,您可以按上述类型绑定,并在测试中用<代码> FAKEYYPECONCONGIONEX//COD>替换。 您还可以将所有内容收集在一起,并将其绑定到
    地图中

    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>".
    
    bind(新的TypeLiteral{})
    .toInstance(ImmutableMaps.newBuilder()
    .add(类型1,TRUE)
    .add(类型2,真)
    //[剪报,您可以用for循环或预构建的地图替换]
    .build());
    //现在可以注入“Map”。
    
    Try(and)++simple for循环。