java - Guice,绑定(bind)到枚举

标签 java enums guice

我很难弄清楚如何使用 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 不会为您选择任意现有的。

您可能想改为执行以下三项操作之一:

  1. 绑定(bind) Snack到特定类型的 Chocolate .

    bind(Snack.class).toInstance(Chocolate.DARK);
    
  2. 绑定(bind) SnackChocolate , 和 Chocolate到特定类型的 Chocolate .这就像上面的,但是现在你可以要求 Chocolate直接获取实例,而不是只能请求 Snack .

    bind(Snack.class).to(Chocolate.class);
    bind(Chocolate.class).toInstance(Chocolate.DARK);
    
  3. 允许开发人员注入(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's ImmutableSet 可以降低一些修改风险或至少 Collections.unmodifiableSet .如果这接近您想要的,您可能有兴趣了解可选的 Multibindings plugin。 .

    当然你也可以自己写Provider<Set<Snack>>@Provides Set<Snack> 的方法,从而每次都获得一个新的集合实例……但如果您希望在您的应用中使用它,那么共享一个不可变副本可能更有意义。

关于java - Guice,绑定(bind)到枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697087/

相关文章:

枚举和匹配属性的 C# 命名约定

mysql - C3P0 连接测试不起作用

java - 为什么我的@singleton 不起作用?

java - 字符串到数组 Int

java - 未使用 appendReplacement 替换模式

java - 使用最小堆实现优先级队列

java - 枚举值不与 switch 中的枚举进行比较

c# - 如何保存枚举mvc的字符串值

java - 使用 google-guice 而不使用绑定(bind)代码

java - Liferay 与 LDAP 和 SSO