Шаблон для создания одиночек, кажется, что-то вроде:Java: Ленивый Initializing Singleton
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance()
{
return instance;
}
}
Однако моя проблема заключается в том, как сделать вам блок с классом, как это, если Singleton Конструктор делает то, что не является модульное тестирование например, вызовы внешней службы, 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.
Вы определили ключевой недостаток шаблона Singleton: он блокирует вас в конкретной реализации интерфейса Singleton. Да, вы можете обойти это по-разному, ужасно уродливым. Вместо этого спросите себя, действительно ли вам нужен синглтон. – hifier
Зачем вам когда-либо понадобилась ленивая инициализация того, что Java уже автоматически предоставляет для каждого типа? –