Инициализация подкласса абстрактного класса внутри метода с использованием Depenency Injection - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть приложение, которое использует абстрактный класс. Абстрактный класс имеет конкретный метод c, используемый классом приложения для определения того, какой подкласс абстрактного класса должен быть инициализирован (в соответствии с входными данными для класса приложения) для выполнения задачи typeSpecifi c.

Хотя я использую guice, чтобы ввести зависимость A в класс приложения.

Является ли if else logi c в классе приложения для инициализации плохого стиля кодирования typeOfInput. Так как я использую guice для инициализации зависимости «A», но использую «new» для инициализации подклассов в одном и том же классе. Есть ли способ, которым "typeOfInput" может быть инициализирован с помощью DI.

Может показаться глупым для некоторых людей, но я новичок. Заранее спасибо

public class Application {

    private final Dependency a;
    private AbstractClass typeOfInput;
    private static final TypeOfInput typeA = some_constant_value;

    @Inject
    Application(final Dependency a){
          this.a = a;
    }


    public doTask(final InputData inputData) {

        if(AbstractClass.getInputType(inputData) == typeA){
          typeOfInput = new classExtendingAbstractClassOne(a);      
        }else{
          typeOfInput = new classExtendingAbstractClassTwo(a);       
        }

    typeOfInput.doTypeSpecificTask();
    }

}
abstract class AbstractClass{

    //Concrete method
    static TypeOfInput getTypeOfInput(final InputData inputData) {
          //Does some processing and returns TypeOfInput value
    }
    abstract void doTypeSpecificTask();
}
class classExtendingAbstractClassOne extends AbstractClass {

        void doTypeSpecificTask() {
               //DO something relevant to this type
        }      

}
class classExtendingAbstractClassTwo extends AbstractClass {

        void doTypeSpecificTask() {
               //DO something relevant to this type
        }      

}

1 Ответ

0 голосов
/ 23 февраля 2020

Ваш метод doTask изменяет внутреннее состояние Application, что дает дополнительные ограничения без какой-либо очевидной выгоды. Теперь ваш экземпляр Application не является потокобезопасным, его нельзя безопасно использовать с несколькими потоками.

Так что, вероятно, вам не нужно искать способы применения DI здесь. Однако было бы неплохо попробовать вместо typeOfInput преобразовать в локальную переменную.

...