我很难弄清楚如何使用 Guice 将接口(interface)绑定(bind)到枚举。
public interface Snack {
public int caloriesCount();
}
public enum Chocolate implements Snack {
MILK(20),
DARK(5),
WHITE(10);
private int calCount;
private Chocolate(int calCount) {
this.calCount = calCount;
}
@Override
public int caloriesCount() {
return calCount;
}
}
如果我尝试:
bind(Snack.class).to(Chocolate.class);
我得到 没有绑定(bind) Chocolate 的实现
我明白,与其尝试绑定(bind)到枚举,不如绑定(bind)到该枚举值的集合,但我不知道如何实现。 感谢任何提示。 谢谢, 马切克
最佳答案
绑定(bind)到这样的枚举类是不可能的,因为 Guice 无法创建自己的实例。在这里,默认行为是创建 Chocolate
的新实例。 ,这没有多大意义— every possible instance of an enum must be declared at compile time within the enum itself , Guice 不会为您选择任意现有的。
您可能想改为执行以下三项操作之一:
绑定(bind)
Snack
到特定类型的Chocolate
.bind(Snack.class).toInstance(Chocolate.DARK);
绑定(bind)
Snack
至Chocolate
, 和Chocolate
到特定类型的Chocolate
.这就像上面的,但是现在你可以要求Chocolate
直接获取实例,而不是只能请求Snack
.bind(Snack.class).to(Chocolate.class); bind(Chocolate.class).toInstance(Chocolate.DARK);
允许开发人员注入(inject)
Set<Snack>
, 这恰好返回所有Chocolate
实例。// manual wildcard required so we don't get an ImmutableSet<Chocolate> Set<Snack> setOfSnacks = ImmutableSet.<Snack>copyOf(Chocolate.values()); // bind a Set<Snack> specifically bind(new TypeLiteral<Set<Snack>>() {}).toInstance(setOfSnacks);
您可以使用任何 Set 实现,但因为所有
toInstance
绑定(bind)是隐式单例,如果使用 Guava'sImmutableSet
可以降低一些修改风险或至少Collections.unmodifiableSet
.如果这接近您想要的,您可能有兴趣了解可选的 Multibindings plugin。 .当然你也可以自己写
Provider<Set<Snack>>
或@Provides Set<Snack>
的方法,从而每次都获得一个新的集合实例……但如果您希望在您的应用中使用它,那么共享一个不可变副本可能更有意义。
关于java - Guice,绑定(bind)到枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697087/