Шаблон для создания синглтонов выглядит примерно так:
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.