Java: Singleton de inicialización perezosa

El patrón para crear singletons parece ser algo como:

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

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

Sin embargo, mi problema es cómo Unidad con una clase como esta si el Singleton Constructor hace algo que no es fácil para la prueba de la unidad, por ejemplo llama a servicio externo, búsqueda de jndi, etc.

Creo que podría refactorizarlo 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;
     }
}

El problema ahora es que solo por la capacidad de prueba de la unidad he forzado a sincronizar getInstance, por lo que solo por el aspecto de prueba tendrá un impacto negativo en la aplicación real. ¿Hay alguna forma de evitarlo, parece que cualquier otro tipo de inicialización diferida no funcionará debido a la naturaleza rota del patrón de doble bloqueo en Java.

Respuestas a la pregunta(5)

Su respuesta a la pregunta