Muito interessante, matéria que mostra que quando implementamos singleton com o método clássico apenas privando o construtor, é possivel criar mais instancias deste com reflection.
Ele mostra o problema, e dá uma solução de implementação para este problema.
singletons em java, são singletons por classloader …
então se ele for chamado de dis classloaders paralelos, serão duas instancias …
isto é bem chato, mas sempre foi assim …
Calma aí… cansei de ver essa discussão por aí e queria entender uma coisa. Eu utilizo Singleton para fazer cache de arquivos XML. O que há de errado nisso? Qual a melhor solução?
Existem duas estratégias, ao menos, que podem te ajudar: padrçao Registry e Ĩnjeção de Depdendências.
Se você usa singleton como uma variável global (só pra poder fazer um getInstance() estático) o objeto merece todos os “elogios” deste tópico. O único moitvo para um Singleton existir é quando você por algum motivo não pode deixar que existam mais de 1 instância do objeto, por isso o artigo é bem questionável. Ele ensina a usar Singletons que não são singletons, são variáveis globais. Misture isso com BO/VO e você tem um sistema com qualidade abaixo do inaceitável.
[quote=armando]Calma aí… cansei de ver essa discussão por aí e queria entender uma coisa. Eu utilizo Singleton para fazer cache de arquivos XML. O que há de errado nisso? Qual a melhor solução?
[/quote]
Creio que os links abaixo podem ajudar a esclarecer…
[quote=urubatan]singletons em java, são singletons por classloader …
então se ele for chamado de dis classloaders paralelos, serão duas instancias …
isto é bem chato, mas sempre foi assim …[/quote]
Tá… entendi… muito legal, muito bonito… eu tenho um xml estruturado, com vários níveis, que define uma estrutura hierarquizada de um arquivo que eu quero interpretar (cuja estrutura eu não quero definir na implementação). Estou em um servidor de aplicação. Perguntas:
Onde eu guardo o objeto que eu vou injetar nas outras classes?
Como eu faço isso usando Registry? (E, mesmo se eu for usar, onde eu guardo esse cara?)
[quote=sergiousp][quote=urubatan]singletons em java, são singletons por classloader …
então se ele for chamado de dis classloaders paralelos, serão duas instancias …
isto é bem chato, mas sempre foi assim …[/quote]
Ok, usar reflection para criar mais de uma instância singleton é possível. Mas a menos que estejamos falando de um atacante mal intencionado, não vejo muitas possibilidades de um código desse estar presente num projeto de verdade. A técnica do cheira a uma espécie de quimioterapia para um câncer que nunca vai existir…
Acho que é ruim generalizar e dizer que singletons são do mal. Quando usados para o propósito que foram criados, em algumas aplicações, eles tem lá o seu valor. Claro, estou restringindo o uso aqui a aplicações de um único class loader e que rodem em um único computador. Mas isso inclui jogos de computadores, editores de textos, imagens, etc.
[EDIT] Agora lendo o argumento acima me lembrei dos programadores C++, quando defendem que ponteiros também não são do mal e tem o seu propósito. Vale só identificar se mesmo nos casos citados o uso de Singletons é tão comum assim. Ou se é tão tentador assim usa-lo como um “repositório de constantes”, a ponto dele ser definitivamente um anti-pattern.
Realmente é uma imbecilidade dizer que Singleton é ruim. Como todos os padrões quando não são bem implementados ou não estão sendo usados corretamente tornam-se um problema. Mas isso não é erro do padrão isso é erro da aplicação do padrão. Então quando vc começar a pensar que o singleton tem problemas , provavelmente é vc que está com problemas ou o seu design.
Singleton é um padrão difícil de implementar e dependendo da aplicação existem necessidades especificas, e como tal se deixado nas mãos de um programador inexperiente pode dar problema depois. Mas o problema está no programador e no seu chefe e não no padrão.
Driblar o padrão com reflection é jogo baixo. Com reflection podemos driblar qualquer programa e causar qualquer tipo de dados. A única forma de evitar isso é usar um SecurityManager (Aliás o ppr artigo explica isso). Com um SecurityManager o setAcessible() não funciona.
Singleton é apenas um factory que retorna sempre a mesma instância. Vcs vão dizer que o factory é um padrão do mal ?!?
Singleton é um anti-pattern !!! Ai já foi demais … isso não é sério.