Подтвердить что ты не робот

Как использовать Google Guice для создания объектов, требующих параметров?

Возможно, я просто слеп, но я не вижу, как использовать Guice (только начиная с него), чтобы заменить вызов new в этом методе:

public boolean myMethod(String anInputValue) {
    Processor proc = new ProcessorImpl(anInputValue);
    return proc.isEnabled();
}

Для тестирования может быть другая реализация Процессора, поэтому я бы хотел избежать вызова new и в процессе этого избавиться от зависимости от реализации.

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

Как мне это сделать и достичь с помощью Guice (2.0)?

4b9b3361

Ответ 1

Есть некоторое время с тех пор, как я использовал Guice сейчас, но я помню что-то под названием "вспомогательная инъекция". Он позволяет определить метод factory, где некоторые параметры предоставляются, а некоторые - впрыскиваются. Вместо ввода процессора вы вводите процессор factory, который имеет метод factory, который принимает параметр anInputValue.

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

Ответ 2

Вы можете получить желаемый эффект, введя "Поставщик", который может попросить во время выполнения предоставить вам процессор. Поставщики предоставляют возможность отложить строительство объекта до тех пор, пока не запросят.

Они описаны в Guice Docs здесь и здесь.

Поставщик будет выглядеть примерно так:

public class ProcessorProvider implements Provider<Processor> {
    public Processor get() {
        // construct and return a Processor
    }
}

Так как Providers сконструированы и введены Guice, они могут сами вставлять бит.

Ваш код будет выглядеть примерно так:

@Inject
public MyClass(ProcessorProvider processorProvider) {
    this.processorProvider = processorProvider;
}

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}

Ответ 3

Требуется ли вашему процессору доступ к anInputValue для всего жизненного цикла? Если нет, можно ли передать значение для вызова метода, который вы используете, например:

@Inject
public MyClass(Processor processor) {
    this.processor = processor;
}

public boolean myMethod(String anInputValue) {
    return processor.isEnabled(anInputValue);
}