OOP设计:避免状态并保持依赖注入

时间:2011-03-13 14:37:48

标签: java dependency-injection

我有一个需要初始化的类,然后才能开始工作。但是,我不想在我的对象中创建它,我希望它被注入 - 所以我需要同时拥有init()和run()。

然而,这会产生一个问题 - 对象现在有状态,我正试图避免它。是否有设计模式来克服这种情况?

2 个答案:

答案 0 :(得分:4)

关于依赖注入: 依赖注入只是将逻辑实现传递到类中的一个奇特术语。依赖注入的最基本形式是constructor。您只需传入一个不希望出现在类中的实例,作为构造函数的参数。

public interface Logic
{
    public void do();
}

public class MyClass
{
    private final Logic logic;

    public MyClass(final Logic logic)
    {
        this.logic = logic;
    }

    public void doLogic() { this.logic.do(); }
}

public class MyLogic implements Logic
{
   public void do() { /* custom logic goes here */ }
}

public class Main
{
    public static void main(final String[] args)
    {
        final MyClass myClass = new MyClass(new MyLogic());
        myClass.doLogic();
    }
}

构建课程: 确保完全构造和初始化类的一种好方法是FactoryMethod模式。创建static MyClass create();方法并制作MyClass构造函数private并初始化您的类,并确保它在传递之前有效。

public class MyClass
{
    /** Factory Method, only way to create a MyClass instance */
    public static MyClass create()
    {
        final MyClass instance = new MyClass();
        // initialize class however you need it
        return instance;
    }

    private MyClass()
    {
        // normal constructor, if no logic you still need this
        // to make sure it can only be created by the Factory Method
        super();
    }
}

答案 1 :(得分:0)

在这种情况下,听起来你应该将你的依赖项作为构造函数参数提供。这为您提供了附加final关键字的额外安全性,因此您可以确保它永远不会再次设置。