我们需要在某些对象之间创建一些映射,用枚举值描述:
public enum ObjectType {
Type1,Type2,Type3,Type4,Type5...TypeN
}
...和
来自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())
有什么建议吗?
答案 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>".