Java: Lazy Inicializando Singleton
O padrão para criar singletons parece ser algo como:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance()
{
return instance;
}
}
No entanto, meu problema é como você une uma classe como essa se o Singleton Constructor faz algo que não é compatível com o teste de unidade, por exemplo. chama serviço externo, pesquisa jndi etc.
Eu acho que poderia refatorá-lo como:
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;
}
}
O problema agora é que, apenas pela testabilidade da unidade, forcei a sincronização do getInstance; portanto, apenas no aspecto do teste, ele terá um impacto negativo no aplicativo real. Existe uma maneira de contornar isso, parece que qualquer outro tipo de inicialização preguiçosa não funcionará devido à natureza quebrada do padrão de bloqueio duplo em jav