Escopo do Singleton

Tenho uma dúvida…

Quando vc tem um singleton, em uma aplicação WEB, mais para ser exato, os BO’s sendo singletons, como posso encarar esses singletons?

1 - Faz sentido ter o BO como singleton? (os BO’s aq são bo e dao ao msm tempo)
2 - Quando tenho um singleton, a instancia é única no servidor, ou seja, todos q acessarem a aplicação WEB teram acesso àquela instancia? Ou durante sua sessão só terá acesso a aquela instancia?
3 - É possível que quando um método da instancia de um singleton quando sendo acessado por mais de uma thread acabem usando as mesmas variáveis locais ou de parâmetro?

Desde já grato a quem puder ajudar :slight_smile:

Encare qualquer Singleton como um f.d.p. que vai dar um tiro na tua testa a qualquer momento.

Não. Nem BO faz sentido. Nem enclausurar sua aplicação num mar de patterns antes de entender sua necessidade real faz sentido.

A instância não é única, pois o servidor provê isolamento entre aplicações. Ou seja, você não consegue instanciar uma classe “deployada” em outro war. Então, mesmo com as técnicas de static, são singletons diferentes para cada pacote.

Sim. Mais um motivo para não usar Singleton. Aliás, classes se serviço não devem nunca ter propriedades (a menos que seja injetado via container).

P.S.: singleton em Java é bastante discutido. Você pode saber muito mais pesquisando no Google.

2 - Quando tenho um singleton, a instancia é única no servidor, ou seja, todos q acessarem a aplicação WEB teram acesso àquela instancia? Ou durante sua sessão só terá acesso a aquela instancia?

A instância não é única, pois o servidor provê isolamento entre aplicações. Ou seja, você não consegue instanciar uma classe “deployada” em outro war. Então, mesmo com as técnicas de static, são singletons diferentes para cada pacote.

— Pelo oq eu entendi, vc está falando da visibilidade de um singleton, entre aplicações hospedadas no servidor. Mas a pergunta na verdade é, se eu tenho uma aplicação lá no servidor, que eh uma aplicação web, ou seja, diversas pessoas vão acessar e usar. O singleton, ele já está instanciado lá no servidor? Ou será instanciado quando o usuario iniciar a sessão, e essa classe será um singleton apenas na sessão do usuário? Ou seja, em todo o sistema, todos que acessam aquela aplicação, de lugares e browsers diferentes usarão a mesma instancia do objeto, ou esse singleton está apenas relacionado sua session?

O motivo dessa pergunta é querer saber se é possível que tenham dois threads de sessões diferentes, acessando o mesmo objeto na memoria do servidor, e método…

se vc já respondeu, vai desculpando a ignorância, e obrigado msm aí, se puder explicar, exemplificar… hehe
vlw!

[quote=digusevero]Tenho uma dúvida…

Quando vc tem um singleton, em uma aplicação WEB, mais para ser exato, os BO’s sendo singletons, como posso encarar esses singletons?

1 - Faz sentido ter o BO como singleton? (os BO’s aq são bo e dao ao msm tempo)
[/quote]

Não. Faz sentido o ter como shared object.
O que vc quer é instanciar apenas um objecto dessa classe, mas nada impede que se instanciem mais. (É diferente de uma classe Desktop que só pode ter uma, e uma só, instancia)

Vc pode usar o padrão Registry para ter acesso global e ter codigo assim
(estou seguindo a sua nomenclatura)


ClienteBO c = BoRegistry.getClientBO();

ou, com um pouco mais de classe:


ClienteBO c = BoRegistry.getBO(ClienteBO.class);

Instancias estáticas - como suponho que seja o seu singleton - valem para toda a JVM (o classloader master na realidade,as isso é detalhe) e portanto para todas as threads.
Cuidado que isso pode ser um problema se o seu BO contém estado.

Não.
Mas cuidado que podem usar os mesmos atributos (sejam estáticos ou não).
BO e DAOs não podem ter estado. Se não tiverem não tem problema.