ti-enxame.com

Em relação ao padrão de suporte estático único

Eu desenvolvi o singleton de várias maneiras, dependendo da condição, como o singleton volátil/preguiçoso, o singleton ansioso, o singleton normal e também através do Enum, mas, especificamente, quero saber sobre o singleton do padrão de suporte estático mostrado abaixo.

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

    private Singleton(){}

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

Informe em que condições é benéfico e quais são os seus benefícios.

21
user2094103

Este padrão é benéfico por pelo menos 3 razões:

  1. Fábrica estática
  2. Inicialização lenta
  3. Discussão segura

A JVM adia a inicialização da classe InstanceHolder até que ela seja realmente usada e, como o Singleton é inicializado com um inicializador estático, nenhuma sincronização adicional é necessária. A primeira chamada para getInstance por qualquer thread faz com que InstanceHolder seja carregado e inicializado, momento em que a inicialização do Singleton ocorre por meio do inicializador estático.

O padrão de suporte estático também é considerado a substituição mais inteligente para o antipadrão de dupla verificação.

58
Vladimir Kishlaly

Esta é uma maneira de fazer um singleton preguiçoso seguro para thread, explorando a maneira como a JVM carrega classes. Você pode ler mais sobre por que e como implementá-lo corretamente no livro Effective Java de Bloch.

Lembre-se de que do testable code pontos de vista singletons (e o estado global em geral) não são benéficos e devem ser evitados.

6
denis.solonenko