Java: Ленивая инициализация синглтона

Шаблон для создания синглтонов выглядит примерно так:

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton(){
    }

    public static Singleton getInstance()
    {
        return instance;
    }
}

Однако моя проблема заключается в том, как объединить с таким классом, если конструктор синглтонов делает что-то, что не является дружественный к модульному тесту, например, вызов внешней службы, поиск jndi и т. д.

Я бы подумал, что можно реорганизовать его так:

public class Singleton {
    private static Singleton instance;
    private Singleton(){
    }

    public synchronized static Singleton getInstance()
    {
        if(instance == null)
             instance = new Singleton();
        return instance;
    }

     //for the unit tests
     public static void setInstance(Singleton s)
     {
          instancce = s;
     }
}

Проблема теперь в том, что я принудительно синхронизировал getInstance только для юнит-тестирования, поэтому только для аспекта тестирования это окажет негативное влияние на реальное приложение. Есть ли способ обойти это, похоже, любая другая ленивая инициализация не будет работать из-за неправильной природы шаблона двойной блокировки в java.

7
задан skaffman 30 April 2011 в 14:10
поделиться