java - 使用依赖注入(inject)在方法内初始化抽象类的子类

标签 java dependency-injection guice

我有一个使用抽象类的应用程序。 抽象类有一个静态具体方法,应用程序类使用该方法来确定应该初始化抽象类的哪个子类(根据应用程序类的输入)来执行 typeSpecific 任务。

虽然我使用 guice 将依赖项 A 注入(inject)到应用程序类中。

应用程序类中的 if else 逻辑初始化“typeOfInput”是错误的编码风格。 因为,我使用 guice 来初始化依赖项“A”,但使用“new”来初始化同一类中的子类。 有什么方法可以使用 DI 初始化“typeOfInput”吗?

对某些人来说可能看起来很愚蠢,但我是一个初学者。 提前致谢

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
        }      

}

最佳答案

您的方法doTask修改了Application的内部状态,这带来了额外的限制,但没有任何明显的好处。现在您的 Application 实例不是线程安全的,无法安全地与多个线程一起使用。

所以您可能不需要在这里寻找应用 DI 的方法。不过,尝试将 typeOfInput 转换为局部变量是个好主意。

关于java - 使用依赖注入(inject)在方法内初始化抽象类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365813/

相关文章:

serialization - Spring中的依赖注入(inject)和序列化对象

java - 使用 Guice 延迟绑定(bind)到实例

java - 设置自定义javafx ComboBox的值

java - HQL的插入子句不更新数据库

java - 如何访问存储在链表集合中的对象的实例变量?

java - 在maven中降级嵌入式tomcat版本

dependency-injection - 将连接字符串注入(inject) DI 解析的类

c# - 在两个服务中使用 ninject 都会在 C# 中创建循环依赖

java - 在单元测试期间创建自定义 @TestScoped Guice 范围

java - Guice:通过方法创建对象