我有一个单身人士课程:
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
。
提前感谢任何指针!
答案 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
方法,这是通往不可测试应用程序的第一步。