Можно ли привязать неизменный набор определенного типа к экземпляру в Guice? - PullRequest
1 голос
/ 18 июня 2019

Я полный новичок в 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 s других типов по-прежнему ведут себя как обычно)

Но приведенный выше код не работает с bind(...), говоря Class must either be declared abstract or implement abstract method error

Примечание. Я немного упростил код, над которым работаю, при написании вопроса, поэтому вышеописанное может не скомпилироваться из коробки.

1 Ответ

3 голосов
/ 18 июня 2019

Прежде всего, модуль 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;
  }

Пожалуйста, используйте Дополнительная документация для дополнительной информации.

...