是否可以在Guice中将某个类型的不可变集绑定到实例?

时间:2019-06-18 08:12:17

标签: java dependency-injection java-8 singleton guice

我是Guice的一个完整的初学者,并且试图实现以下目标:

public class Apple {

    private final Integer size;
    public Apple(Integer size) {
        this.size = size;
    }
}

public abstract class AppleModule {
   protected AppleModule() {

      ImmutableSet<Integer> sizes = ImmutableSet.of(1, 2, 3); 
      ImmutableSet<Apple> apples = sizes.stream().map(Apple::new).collect(ImmutableSet.toImmutableSet());
      bind(new ImmutableSet<Apple>(){}).toInstance(apples);

   }
}

,因此每次我声明类似ImmutableSet<Apple> apppleBasket;之类的内容时,都会得到相同的列表对象。 (但是其他类型的ImmutableSet仍然正常)

但是上面的代码不适用于bind(...)Class must either be declared abstract or implement abstract method error

注意:我在编写问题时简化了我正在处理的代码,因此上面的代码可能不是开箱即用的。

1 个答案:

答案 0 :(得分:3)

首先,Guice模块必须扩展AbstractModule类并重写其configure()方法。第二,如果要绑定通用类型,则需要使用TypeLiteral

public class AppleModule extends AbstractModule {

  @Override
  public void configure() {
    ImmutableSet<Integer> sizes = ImmutableSet.of(1, 2, 3);
    ImmutableSet<Apple> apples = sizes.stream().map(Apple::new)
      .collect(ImmutableSet.toImmutableSet());

    bind(new TypeLiteral<ImmutableSet<Apple>>(){}).toInstance(apples);
  }
}

或者,例如,您可以使用@Provides方法。

  @Provides
  ImmutableSet<Apple> provideAppleBasket() {
    ImmutableSet<Integer> sizes = ImmutableSet.of(1, 2, 3);
    ImmutableSet<Apple> apples = sizes.stream().map(Apple::new)
      .collect(ImmutableSet.toImmutableSet());
    return apples;
  }

请使用Guice documentation获取更多信息。