有没有办法将几个实例绑定到 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
}
...和
- 用于这些类型的几个策略实例
- 或者,例如,与提到的对象类型相关的布尔值
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>".
我们需要在一些对象的多种类型之间创建一些映射,用枚举值描述:
public enum ObjectType {
Type1,Type2,Type3,Type4,Type5...TypeN
}
...和
- 用于这些类型的几个策略实例
- 或者,例如,与提到的对象类型相关的布尔值
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>".