DEV Community

Paula Santana
Paula Santana

Posted on • Edited on

6 1

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.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay