如何将对象注入单例?

时间:2012-01-22 19:14:25

标签: java dependency-injection singleton

我有一个单身人士课程:

public class Widget
{
    private Mapper mapper;

    private static Widget SINGLETON;

    private Widget(Mapper map)
    {
        setMapper(map);
    }

    public Widget getInstance()
    {
        if(SINGLETON == null)
            SINGLETON = new Widget(???);

        return SINGLETON;
    }
}

我不仅不了解如何在其私有构造函数中传递SINGLETON Mapper,我还没有看到如何使用依赖注入来正确设置单例。说Mapper是一个界面。也许在“正常”执行下我想传递SINGLETON StandardMapper个实例,但在进行单元测试时,我想传递MockMapper

提前感谢任何指针!

3 个答案:

答案 0 :(得分:1)

将参数传递给getInstance(),也许提供一个有Widget的人。

如果你正在使用DI框架,还有其他选择,但你没有提到你在做什么。也会有几个AOP选项,但最终你仍然需要决定如何指出要使用的Widget实现。

(小尼特,你不是“注射单身”,你正在将注入单身。)

答案 1 :(得分:0)

这就是我要注入单身人士的行为。

public enum Widget {
    SINGLETON;

    private Mapper mapper;

    public void setMapper(Mapper mapper) { this.mapper = mapper; }
}

如果你要在某处注入这个单例,我会让它实现一个接口

public enum Widget implement IWidget {

这样,只要您使用其界面,就可以根据需要模拟单例。

答案 2 :(得分:0)

在这种情况下,您必须使Mapper参数为getInstance

另一种选择是从某种存储库获取Mapper的实例,或者另一种静态getInstance方法,这是通往不可测试应用程序的第一步。