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

questionAnswers(5)

yourAnswerToTheQuestion