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");
Sem comentários:
Enviar um comentário