Как вы вводите объект в синглтон? - PullRequest
1 голос
/ 22 января 2012

У меня есть одноэлементный класс:

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 a Mapper в его частный конструктор, я не вижу, как я могу использоватьвнедрение зависимостей для правильной настройки синглтона.Скажем Mapper это интерфейс.Возможно, при «нормальном» выполнении я хочу передать SINGLETON экземпляр StandardMapper, но во время модульного тестирования я хочу передать его MockMapper.

Заранее спасибо за любые указатели!

Ответы [ 3 ]

1 голос
/ 22 января 2012

Передайте аргумент getInstance(), возможно, предоставив его с Widget.

и без него. Если вы используете DI-фреймворк, есть другие варианты, но вы не упоминаете, что вы 'делаешьТакже будет несколько вариантов AOP, но в конечном итоге вам все равно придется решить, как указать, какую Widget реализацию использовать.

(Незначительно, вы не "вводите синглтон""Вы вводите в синглтон.)

0 голосов
/ 22 января 2012

В этом случае вам нужно будет сделать Mapper параметром getInstance

Другой альтернативой является получение экземпляра Mapper из какого-либо репозитория или другого статического getInstance метода.который является первым шагом на долгом пути к непроверенному приложению.

0 голосов
/ 22 января 2012

Это то, что я бы сделал, чтобы внедрить в синглтон.

public enum Widget {
    SINGLETON;

    private Mapper mapper;

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

Если вы собираетесь внедрить этот синглтон куда-нибудь, я бы заставил его реализовать интерфейс

public enum Widget implement IWidget {

Этоспособ синглтона можно смоделировать при необходимости, если вы используете только его интерфейс.

...