Java - como usar a classe Singleton?
O propósito do Singleton é controlar a criação de objetos, limitando o número de objetos a apenas um. Como há apenas uma instância de Singleton, quaisquer campos de instância de um Singleton ocorrerão apenas uma vez por classe, assim como os campos estáticos. Os singletons geralmente controlam o acesso a recursos, como conexões de banco de dados ou soquetes.
Por exemplo, se você tiver uma licença para apenas uma conexão para seu banco de dados ou se seu driver JDBC tiver problemas com multithreading, o Singleton garante que apenas uma conexão seja feita ou que apenas um thread possa acessar a conexão por vez.
Implementando Singletons
Exemplo 1
A implementação mais fácil consiste em um construtor privado e um campo para armazenar seu resultado, e um método de acesso estático com um nome como getInstance ().
O campo privado pode ser atribuído de dentro de um bloco inicializador estático ou, mais simplesmente, usando um inicializador. O método getInstance () (que deve ser público) simplesmente retorna esta instância -
// File Name: Singleton.java
public class Singleton {
private static Singleton singleton = new Singleton( );
/* A private Constructor prevents any other
* class from instantiating.
*/
private Singleton() { }
/* Static 'instance' method */
public static Singleton getInstance( ) {
return singleton;
}
/* Other methods protected by singleton-ness */
protected static void demoMethod( ) {
System.out.println("demoMethod for singleton");
}
}
Aqui está o arquivo principal do programa, onde criaremos um objeto singleton -
// File Name: SingletonDemo.java
public class SingletonDemo {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance( );
tmp.demoMethod( );
}
}
Isso produzirá o seguinte resultado -
Resultado
demoMethod for singleton
Exemplo 2
A implementação a seguir mostra um padrão de design clássico Singleton -
public class ClassicSingleton {
private static ClassicSingleton instance = null;
private ClassicSingleton() {
// Exists only to defeat instantiation.
}
public static ClassicSingleton getInstance() {
if(instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
}
A classe ClassicSingleton mantém uma referência estática para a instância única do singleton e retorna essa referência do método getInstance () estático.
Aqui, a classe ClassicSingleton emprega uma técnica conhecida como instanciação preguiçosa para criar o singleton; como resultado, a instância singleton não é criada até que o método getInstance () seja chamado pela primeira vez. Essa técnica garante que instâncias singleton sejam criadas somente quando necessário.