[quote=ViniGodoy]Leonardo… o double checked locking não é thread-safe e é considerado um anti-pattern. Além disso, gera uma complicação desnecessária no código, para um ganho de performance altamente questionável.
Por favor, leia o material: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Ou, com mais detalhes: http://www.ibm.com/developerworks/java/library/j-dcl.html
No geral, é uma má idéia usar singleton. O ideal é usar o padrão registry ou um framework de dependency injection. Eu só recomendo o singleton quando você está rodando uma aplicação que faz uso de um único classloader. Isso exclui praticamente todas as aplicações web. Mas inclui jogos de computadores, aplicações para celular e applets por exemplo.
O singleton também é interessante se você quiser manter sua aplicação simples (não obrigar o seu usuário a ter um framework de DI). Isso é importante se o seu programa precisar ter um binário pequeno (aplicação para celular, palm, applets). Mas nesse caso, procure estudar as desvantagens do singleton e suas limitações.
No caso do singleton com lazy-initialization, a única forma segura de se fazer isso é:
[code]public class Singleton {
private Singleton myInstance = null;
private synchronized Singleton getInstance() {
if (myInstance == null)
myInstance = new Singleton();
return myInstance;
}
}[/code]
Geralmente, não é necessária. O Java já tem um esquema de lazy-loading em suas classes. E como a classe do Singleton só é usada se o Singleton for usado, geralmente é preferível manter a classe ultra-simples, com eager loading.
Eu só recomendo em casos de Singletons realmente pesados, que demorem para carregar. Mas esse geralmente não é o caso.
Tudo isso falo assumindo que você vai usar o Singleton para seu propósito: garantir que um objeto terá uma única instância. E não para fazer um “repositório de constantes”. [/quote]
neste caso pq nao precisam ser estáticos ?