A singleton Pattern é um design pattern que restringe a instanciação de uma classe a um objecto. Isto é útil quando pretendemos que não sejam utilizada mais que uma instância do da mesma classe.
Todas as solução são
Thread-Safe.
Inicialização Lazy
public class Singleton {
private static Singleton instance = null;
private Singleton() {
//TODO Completar construtor
}
public synchronized static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
Inicialização Eager
Se o programa precisar sempre de uma instância ou se o custo de criação de uma instância não for muito elevado em termos tempo/recursos, pode utilizar a inicialização eager.
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
//TODO Completar construtor
}
public static Singleton getInstance() {
return instance;
}
}
Inicialização Static block
Esta solução permite algum pré-processamento, por exemplo, para verificação de erros.
public class Singleton {
private static final Singleton instance;
static {
try {
instance = new Singleton();
} catch (IOException e) {
throw new RuntimeException("Erro ão inicializar", e);
}
}
private Singleton() {
//TODO Completar construtor
}
public static Singleton getInstance() {
return instance;
}
}
"Double-checked locking"
Esta solução permite reduzir o uso do
synchronized no método
getInstance().
Utilizando "double-checked locking", verificamos se a instância já existe, se não, depois sincronizamos.
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {
//TODO Completar construtor
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Emun
Desde o Java 5.0, a forma mais simples de criar um Singleton é através do tipo Enum. Com esta abordagem tiramos partido da garantia do Java de que qualquer valor de um enum só é inicializado uma vez.
public Enum Singleton {
INSTANCE;
public void execute(String arg) {
//TODO completar
}
}
Exemplo:
Singleton.INSTANCE.execute("qualquer coisa");