Singleton é um AntiPattern?

Olá Pessoal,

Vejo que muitos programadores dizem que Singleton é um antipattern? O que voces teem a dizer sobre isto ? E porque acham que ele é um antipattern ?

Abraços

Olá Gilson,
Gostaria de saber a sua opinião a respeito dessa colocação. :lol:

Singleton eh um pattern, que tem usos rarissimos em aplicacoes J2EE.

Quando usado incorretamente (ou seja, 100% das vezes que eu vi ate hoje em codigo de verdade), singletons sao equivalentes a variaveis globais.

Resumindo:

Singleton pra guardar estado “per-JVM”: pattern.
Singleton pra guardar estado global: anti-pattern.

O que vem a ser um estado “per-JVM”?

Singleton é uma …

http://steve.yegge.googlepages.com/singleton-considered-stupid

Olá Wilian,

Estou tentando montar um conceito ainda sobre o assunto por isso ainda nao tenho uma opiniao formada, mas alguns programadores dizem o seguinte a respeito do singleton, gostaria de que mais programadores opinassem e colocassem suas experiencias para que todos possam se beneficiar do assunto eu estou pesquisando a respeito como disse para formar uma opiniao:

  1. É uma maneira orientada a objetos de trabalhar com variáveis globais, o que caracteriza design mal feito

  2. Singleton possui Forte Acoplamento entre classes e o correto deveria ser fraco acoplamento.

  3. Por causa do forte acoplamento, singletons dificultam testes unitários

Estado que existe existe pra qualquer metodo, classe, package ou thread dentro da mesma JVM :wink:

Eu nunca tinha pensado a respeito do singleton dessa maneira.

Eu conheço alguns sistemas que possuem classes com regras de negócio. Classes que recebem parâmetros, fazem um processamento em cima destes parâmetros e retornam um valor ou objeto.

É razoável defender que o método que faça a formatação do cnpj deva estar na Classe onde fica o cnpj, por exemplo, uma classe PessoaJutidica.

Todavia existem situações onde pode fazer sentido colocar um método static em uma classe não instanciável. O java.lang.Math é um exemplo de classe não instanciável, mas NÃO SE TRATA DE UM SINGLETON.

Voltando à questão levantada:

Eu tenho um sistema web e preciso de um método que processe Strings para mim. Eu envio um “Não” e ele me devolve um “Não”. A priori uma Classe com um método estático e um HashSet privado, com a minha lista de Strings resolveria o caso, certo? Mas e se eu quiser puxar a lista de Strings de um properties? Não vale a pena ser um singleton para evitar a abertura do arquivo a cada chamada?

Olá

Singletonitis

Mais discussão sobre esta doença em http://www.theserverside.com/blogs/thread.tss?thread_id=42116

[]s
luca

Eu não gosto muito de singleton, mas as vezes tenho que usar.

Um caso: por usar EJB 2.X e não poder usar um sistema de IoC\DI, as interfaces de serviços tem que ser criadas por factories. As factories em geral são sempre singleton.