DEV Community

Paula Santana
Paula Santana

Posted on • Edited on

Java Efetivo Essencial - Singleton

Implemente a propriedade de um singleton com um construtor privado ou um tipo enum

Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.

Entendendo...

Singleton é um design pattern utilizado para instanciar uma única vez uma classe durante o ciclo de vida da aplicação.
Exemplos de objetos tipo singleton que utilizamos no dia a dia em aplicações Java são Enum e os Beans do Spring que por padrão são criados como singleton.
Singletons representam um objeto sem estado na aplicação, com a função de executar tarefas / funções.

Como?

Duas formas mais comuns de se criar um Singleton envolvem manter seu construtor privado e ter seus atributos como estáticos publicos para que seja permitido o acesso a instância única.

Exemplo A

public class CalculadoraDeMateriais {
  public static final CalculadoraDeMateriais INSTANCE = new CalculadoraDeMateriais();

  private CalculadoraDeMateriais() {
  }
}
Enter fullscreen mode Exit fullscreen mode

Atenção

Apesar de garantirmos que somente uma única instância seja invocada no exemplo A, um cliente com privilégios pode utilizar o método AccessibleObjet.setAccessible para acessar o construtor privado então para nos precavermos para essa possibilidade utilizamos o exemplo B, onde garantimos que caso já exista a instância que seja lançada Exception.

Exemplo B

public class CalculadoraDeMateriais {

  private static final CalculadoraDeMateriais INSTANCE=
          new CalculadoraDeMateriais();

  private CalculadoraDeMateriais() {
    if (INSTANCE != null) {
      throw new IllegalStateException();
    }
  }

  public static CalculadoraDeMateriais getInstance() {
    return INSTANCE;
  }
}
Enter fullscreen mode Exit fullscreen mode

Mais informações...

  • A abordagem do campo público deixa bem claro que o objeto é um singleton.
  • Podemos utilizar junto com o static factory pois isso permite flexibilidade futura caso não queira mais que seja um singleton.
  • Mas a maioria dos casos onde queremos usar um objeto como singleton podemos utilizar Enums que são classes que possuem atributos e métodos e possuem uma única instância em tempo de execução.
  • Utilizar Singleton como mostrado nos exemplos acima é pouco usual hoje em dia e é mais difícil de testar.
  • Quando estamos falando do uso de Beans do Spring por exemplo que tem como padrão serem criados com escopo de Singleton conseguimos testar.
  • Casos mais comuns hoje em dia que utilizamos no código e que funciona super bem são os Enums.

Top comments (0)