Classe Singleton em Java - Como usar a classe Singleton?



Este artigo sobre Singleton Class em Java fala sobre as várias maneiras pelas quais uma classe pode ser transformada em Singleton junto com implementações práticas.

Em Java, uma classe singleton é uma classe que pode ter apenas uma instância por vez. É um dos cinco padrões de Design Criativo em Java que ajuda no desenvolvimento sem esforço de . Por meio deste artigo, darei a você uma visão clara do que é uma classe singleton em Java e como você pode criá-la.

Abaixo estão os tópicos que irei cobrir neste artigo:





qual método de classe de scanner lê uma string?

Vamos começar.

O que é uma classe Singleton em Java?

Em termos leigos, uma classe Singleton em Java é a classe que permite o acesso a ela por meio de uma única instância por vez. Este padrão de design é para restringir a instanciação desnecessária de uma classe e garantir que apenas um existe em qualquer ponto do tempo por instância JVM. Assim, com este padrão, qualquer classe definida como Singleton tem apenas uma única instânciacom um ponto global de acesso a ele. Ao contrário das classes normais, uma classe singleton não é destruída ao final do ciclo de vida do aplicativo.



Mas por que precisamos de uma classe individual em primeiro lugar?

Bem, ao restringir a criação de instância de uma classe, ele economiza espaço de memória, pois agora o objeto não será criado cada vez que uma nova solicitação for feita. Em vez disso, um único objeto será usado repetidamente. Esta é a razão pela qual o padrão Singleton em Java é mais usado com e aplicativos de banco de dados. É basicamente usado para registro, armazenamento em cache, pool de threads, definições de configuração e muito mais.

Espero que você tenha entendido bem o conceito de classe Singleton em Java. Então, vamos prosseguir nesteArtigo Singleton Class in Java e veja como eles são criados.



Maneiras de projetar uma classe Java Singleton

Para criar um singleton de classe em Java, você precisa das três coisas a seguir:

  1. membro estático de uma classe
  2. construtor privado
  3. método de fábrica estático

Uma vez que Java permite que os desenvolvedores explorem seus horizontes, existemvárias maneiras de criar uma classe Singleton. Abaixo, listei os mais populares.

  1. Método de inicialização rápida
  2. Método de inicialização lenta
  3. Método Thread Safe Singleton
  4. Inicialização lenta com método de bloqueio duplo
  5. Método de carregamento lento
  6. Método de inicialização de bloco estático

Agora vamos mergulhar mais fundo em cada uma dessas abordagens, uma por uma.

1. Método de inicialização rápida

Este é o método mais fácil de criar uma classe Singleton em que a instância é criada no momento do carregamento da classe. Para criar uma classe singleton usando este método, você precisa seguir as etapas mencionadas abaixo:

  1. Declare o construtor privado.
  2. A próxima etapa é criar um membro da classe privada para esta classe Singleton.
  3. Agora, você precisa definir um método de fábrica que será usado para retornar o objeto de sua classe, que criamos como uma instância do membro da classe.
  4. Você pode até declarar um membro estático público se quiser acessar essa instância estática diretamente.

Agora, vamos ver como implementá-los.

// Inicialização rápida public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Se você vir o código, poderá observar que cada vez que instanciamos um objeto, estamos utilizando ogetInstance ()método em vez de invocar a classe construtor .Mas tem suas próprias desvantagens. Se você usar esse método para criar um singleton de classe, uma instância será criada independentemente do fato de o aplicativo estar usando ou não.

Então, vamos seguir em frente e ver outra maneira de criar uma classe singleton em Java.

2. Método de inicialização lenta

Esse método é chamado de inicialização lenta porque adia a criação da instância da classe até seu primeiro uso. O que quero dizer é que, com este método, um objeto é criado apenas se for necessário. Isso ajuda a evitar a criação desnecessária de . Para projetar uma classe singleton dessa maneira, você precisa seguir as etapas listadas abaixo:

sort int array c ++
  1. Em primeiro lugar, declare o construtor como privado.
  2. Em seguida, você precisa criar uma instância estática privada para esta classe, mas não precisa instanciá-la ainda.
  3. Finalmente, crie um método de fábrica que primeiro verificará se o membro da instância é nulo ou não. Caso contrário, ele criará uma instância da classe singleton para você e a retornará.

O código abaixo mostra como fazer isso.

// Inicialização lenta classe pública LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} retornar INSTANCE}}

3. Thread Safe Singleton Método

Mas a abordagem acima pode levantar algumas preocupações nos cenários simultâneos. Uma vez que o padrão singleton é usado principalmente com multi-threads e sevários threads entram na condição if ao mesmo tempo que podem levantar problemas. Para evitar isso, tentamos criar uma classe singleton thread-safe tornando o método de acesso global sincronizado. Isso garante que apenas um thread esteja executando este método em qualquer momento. Consulte o código abaixo para ver a implementação:

como usar o tableau public
// Thread Safe Singleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public static synchronized ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} retornar INSTANCE}}

Mas às vezes essa abordagem também pode se tornar muito complicada, pois cada vez que o métodoé invocado, ele precisa esperar que o bloqueio seja liberado antes que o método possa usá-lo. Isso resulta em desaceleração do processo e nos leva à próxima abordagem que éInicialização lenta com bloqueio duplo.

4. Inicialização lenta com bloqueio duplo Método

Nesta abordagem, não sincronizamos os métodos. Em vez disso, envolvemos o código de criação do objeto em um bloco sincronizado.Você pode dizer que, verificando os bloqueios do thread de antemão,reduz o número de aquisições de bloqueio. Essa abordagem geralmente resulta no aumento do desempenho do aplicativo. Confira o código abaixo para ver como isso é feito.

// Inicialização lenta com Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (if (ANCE == null) {synchronized (LazyDoubleLockSingleton= INSTANCE) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Método de carregamento lento

Este método é baseado em JSL (Java Language Specification) e de acordo com este carregará membros de dados estáticos apenas quando eles forem necessários. Portanto, quando sua classe singleton é carregada na JVM, nenhuma instância é criada. Além disso, durante a execução do programa, o método global é invocado em ordem sequencial. Com este método, você não precisa sincronizar explicitamente o getInstance () estático para carregar e inicializar. O membro da classe estática será chamado de maneira sequenciada adequada, o restante das chamadas simultâneas do método global são retornadas na mesma ordem, sem a necessidade de executar a sobrecarga de sincronização.

Abaixo está o código para realizar o mesmo.

// Método Lazy Load public class LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Método de inicialização de bloco estático

Este método de criação de uma classe singleton em Java ésemelhante ao método de inicialização rápida. A única diferença é que a instância para esta classe é criada dentro do bloco estático tendo funcionalidade.

// Inicialização do bloco estático public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // tratamento de exceção dentro do bloco estático static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Ocorreu exceção ao criar uma classe Singleton ')}} public staticBlockSingleton getInstance () {return INSTANCE}}

Isso nos leva ao final deste artigo sobre a classe Singleton em Java. Se você quiser saber mais sobre Java, consulte nosso .

Agora que você entendeu o que é uma classe Singleton em Java, verifique o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java. O curso foi desenvolvido para dar a você uma vantagem inicial na programação Java e treiná-lo para os conceitos básicos e avançados de Java, juntamente com várias estruturas Java, como Hibernate e Spring.

Tem alguma questão para nós? Mencione isso na seção de comentários deste artigo “Singleton Class in Java” e entraremos em contato com você o mais breve possível.