| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 05:30:42
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
Pessoal, ao testar diversos códigos com o pattern singleton, deparei com um problema, nenhum deles foi 100% eficiente, pelo menos não como
eu desejava que fosse. Aqui vai um código que testei.
Se você executar várias vezes, perceberá que o objeto será duplicado... existe alguma possibilidade
de evitar a duplicação do objeto na memória, para criar por exemplo uma única instancia do aplicativo
utilizando o swing...
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 06:34:29
|
AndreAlves
JavaBaby
![[Avatar]](/images/avatar/35296a4054db6816185054cbdc02e041.jpg)
Membro desde: 23/06/2007 14:32:00
Mensagens: 78
Localização: Santos/SP
Offline
|
O código aparentemente está ok. Sempre que eu vi ou fiz Singleton foi assim.
Se executar este código duas vezes, ele vai criar dois objetos pois foram iniciadas duas VMs diferentes (uma para cada execução).
Por isso que na empresa a gente evita Singleton no ambiente JEE. Ninguém garante que o app server vai executar a aplicação sempre na mesma VM (a gente usa Websphere ND, com multiplos servers em um cluster).
O que exatamente está acontecendo?
O que exatamente você está querendo?
|
www.beginning-java.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 09:04:46
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Essa é uma péssima implementação de Singleton. Ela é desnecessariamente complexa.
A mais correta no Java é:
De qualquer forma, o singleton em java não funciona com multiplos class loaders. Portanto, o Singleton não é um bom padrão para aplicações web no geral (na verdade, não é um bom padrão para aplicações no geral).
Agora, a minha dúvida é. Como você chegou a conclusão que essa classe foi instanciada mais de uma vez?
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 09:36:23
|
clunsde
Debugger
![[Avatar]](/images/avatar/15134fabce1af48f50bc470ddfacdf56.jpg)
Membro desde: 10/09/2006 16:45:57
Mensagens: 65
Localização: Blumenau
Offline
|
Eu diria que o mais correto, seria fazer um tipo Enum, para implementar o padrão Singleton.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 09:38:44
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
clunsde wrote:Eu diria que o mais correto, seria fazer um tipo Enum, para implementar o padrão Singleton.
Essa é uma boa também. Mas acho que ainda mais correto é não usar o padrão Singleton.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 09:43:24
|
viniciusalvess
Java Ninja
![[Avatar]](/images/avatar/2ce5c4c3e3cfda2fb5c21d44b204aea8.jpg)
Membro desde: 02/09/2008 12:17:08
Mensagens: 259
Offline
|
clunsde wrote:Eu diria que o mais correto, seria fazer um tipo Enum, para implementar o padrão Singleton.
Seguindo as palavras do Joshua ...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 16:51:30
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
ViniGodoy wrote:
Agora, a minha dúvida é. Como você chegou a conclusão que essa classe foi instanciada mais de uma vez?
mandando imprimir ....a variavel... 'singletonObject', ...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2010 16:58:09
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
Testei vários singletons... e não consegui criar uma única instância de um jframe por exemplo....
Uma das opções foi criar um arquivo 'lock' ao iniciar o aplicativo e apagá-lo ao fechar, mas pode ocorrer problemas como o programa ser encerrado
forçosamente, seja por queda de luz por exemplo.. ou erro do sistema operacional, ai o arquivo ficaria e ao abrir o aplicativo novamente mostraria
mensagem que já existe instância aberta do aplicativo... e ter que resolver manualmente.... isso é o que quero evitar... quem vai usar o aplicativo
não tem se preocupar com isso... quero que o próprio aplicativo resolva...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 00:24:43
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Espere um pouco. Esse padrão existe no contexto de uma aplicação. Você está tentando criar um Singleton que exista entre múltiplas instância da sua aplicação inteira?
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 01:03:26
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
Espere um pouco. Esse padrão existe no contexto de uma aplicação. Você está tentando criar um Singleton que exista entre múltiplas instância da sua aplicação inteira?
Isso mesmo... não permitir que haja duas instâncias do mesmo aplicativo..., um dos motivos, banco de dados embarcados como mysql, h2, não permitem
que você possua mais de uma instância usando o banco de dados... o padrão singleton funciona no contexto de uma aplicação, mas o caso é diferente...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 01:09:18
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Então, isso o padrão Singleton jamais se propôs a resolver. Ele garante que exista apenas uma única instancia na aplicação, não entre múltiplas aplicações.
Para fazer o que você quer, existem algumas alternativas:
1. Usar o lock (como vc já sugeriu, mas tem problemas caso a aplicação aborte);
2. Abrir um ServerSocket numa porta qualquer. E só manter a aplicação aberta caso consiga;
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 14:11:18
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
2. Abrir um ServerSocket numa porta qualquer. E só manter a aplicação aberta caso consiga;
Mas e a questão da segurança... teria algum problema...
This message was edited 1 time. Last update was at 28/12/2010 14:13:59
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 14:27:22
|
suspiro10
JavaBaby
Membro desde: 09/11/2008 19:31:12
Mensagens: 88
Offline
|
Testei a solução 2 e perfeitamente.. ta funcionando melhor que a primeira... quando o aplicativo fecha automaticamente... fecha o ServerSocket...
valew....
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 15:02:31
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
suspiro10 wrote:Mas e a questão da segurança... teria algum problema...
Não, nenhum problema. Até pq seu ServerSocket fica mudo, e ignora todos os pacotes que vem através dele.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/12/2010 16:45:25
|
PedroTOliveira
JavaChild
Membro desde: 03/09/2010 10:44:54
Mensagens: 111
Offline
|
De qualquer forma, o singleton em java não funciona com multiplos class loaders. Portanto, o Singleton não é um bom padrão para aplicações web no geral (na verdade, não é um bom padrão para aplicações no geral).
Eu discordo que singleton é um padrão ruim para aplicações WEB.
Muito pelo contrário em um contexto de injeção de dependências e se tratando da camada de serviços, singleton são bem aceitos. O que não são recomentados são Static Singletons.
Apesar que você pode sim compartilhar uma váriável de instância em uma mesma aplicação web, basta carregar ela em um Classloader anterior.
Exemplo: pasta "/tomcat/common/"
|
blog: www.pedro.oliveira.nom.br/blog/
twitter:www.twitter.com/pedrotoliveira |
|
|
 |
|
|