| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 18:21:16
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Jedi_FeniX wrote:Tem como pegar a instancia de uma classe que já está rodando?
Por que no meu aplicativo eu só posso inicializa uma classe uma única vez e queria saber também se tem como "matar" esta instancia que esta rodando?
Você pode usar o padrão descrito no .net, chamado "disposable". O Java usa isso em algumas classes.
Simplesmente, crie um método "close", "dispose", "kill" na sua classe.
Após a invocação desse método, marque alguma propriedade "isDisposed" para true e passe a lançar uma exceção de "ObjectDisposedException", "UnsupportedOperationException" ou "IllegalStateException" sempre que alguém chamar qualquer método.
Não é exatamente a melhor das políticas... mas é uma alternativa interessante em muitos casos.
|
@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) 15/07/2008 18:32:47
|
fredferrao
GUJ Master
![[Avatar]](/images/avatar/128ac9c427302b7a64314fc4593430b2.jpeg)
Membro desde: 01/06/2005 13:23:32
Mensagens: 1901
Localização: Brasil
Offline
|
ViniGodoy wrote:
fredferrao wrote:Blz entao apague o metodo killMySelf, que resolve o problema.
Sim, e não se apaga mais o Singleton...
como eu falei desde o início.
Você só consegue apagar o Singleton usando a classe WeakReference. Assim você consegue garantir que não há referências fortes externamente, como a que eu fiz ali.
Mas ainda assim, com Singleton ou sem Singleton, é praticamente impossível "matar" uma instância.
Nao se apaga?? e que tal:
|
Não respondo dúvidas via MP! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 18:37:38
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Você está acompanhando toda discussão, ou só respondendo por impulso a última coisa que lê? Se retirar o método killMySelf, você terá sempre a referência da variável estática, dentro da classe do Singleton. Como demonstrado, você não pode simplesmente apagar aquela variável estática, sob o risco de quebrar o padrão Singleton. Portanto, um objeto singleton não será apagado facilmente. Você até pode manter o killMySelf e usar o padrão disposable que descrevi ali em cima. Isso forçaria que quem capturou uma referência externa tenha que libera-la, já que usa-la dispararia exceção. De qualquer forma, é menos elegante do que manter a instância do singleton ativa para sempre. Afinal, uma única instância dificilmente ocupa uma quantidade significativa de memória.
This message was edited 2 times. Last update was at 15/07/2008 18:38:49
|
@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) 15/07/2008 19:05:28
|
fredferrao
GUJ Master
![[Avatar]](/images/avatar/128ac9c427302b7a64314fc4593430b2.jpeg)
Membro desde: 01/06/2005 13:23:32
Mensagens: 1901
Localização: Brasil
Offline
|
ViniGodoy wrote:Você está acompanhando toda discussão, ou só respondendo por impulso a última coisa que lê?
Se retirar o método killMySelf, você terá sempre a referência da variável estática, dentro da classe do Singleton.
Como demonstrado, você não pode simplesmente apagar aquela variável estática, sob o risco de quebrar o padrão Singleton.
Portanto, um objeto singleton não será apagado facilmente. Você até pode manter o killMySelf e usar o padrão disposable que descrevi ali em cima. Isso forçaria que quem capturou uma referência externa tenha que libera-la, já que usa-la dispararia exceção.
De qualquer forma, é menos elegante do que manter a instância do singleton ativa para sempre.
Afinal, uma única instância dificilmente ocupa uma quantidade significativa de memória.
Eu estou lendo, agora, voce esta lendo o que estou escrevendo, eu estou escrevendo sobre o que vc escreveu de "Voila" quebrar o singleton e ter 2 variaveis apontando para objetos diferentes.
Leu onde escrevi "exemplo = null"??
Bom ou nao estou te entedendo ou vc é que nao esta me entendendo.
Bom meditemos o seguinte codigo pra ver o que acontece.
Claro que pra acabar com o objeto tem que se digitar exemplo = null, porem deixando assim, evitamos ter 2 objetos diferentes da classe Exemplo, ou seja temos sim um singleton.
|
Não respondo dúvidas via MP! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 23:45:05
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Ok, mas fazer: Exemplo exemplo = Exemplo.getInstance(); exemplo = null; Não mata o singleton. Mata uma referência ao Singleton, mas o objeto Singleton ainda existe, conforme demonstra o resto do seu exemplo. Ainda existe uma variável estática (que está dentro da classe Exemplo), guardando a referência do Singleton. E o que o autor do tópico perguntou e se há um jeito de eliminar a existência de um objeto, em definitivo. No caso do Singleton, estou tentando demonstrar que não há. Ou melhor até há, mais é muito mais difícil do que com um objeto comum. Era essa variável que o método killMySelf() tentava apagar exatamente a referência estática, interna e na classe, que mantém o Singleton vivo. E por isso causava a duplicação do Singleton.
This message was edited 1 time. Last update was at 15/07/2008 23:48:13
|
@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) 16/07/2008 08:33:37
|
fredferrao
GUJ Master
![[Avatar]](/images/avatar/128ac9c427302b7a64314fc4593430b2.jpeg)
Membro desde: 01/06/2005 13:23:32
Mensagens: 1901
Localização: Brasil
Offline
|
ViniGodoy wrote:Ok, mas fazer:
Exemplo exemplo = Exemplo.getInstance();
exemplo = null;
Não mata o singleton. Mata uma referência ao Singleton, mas o objeto Singleton ainda existe, conforme demonstra o resto do seu exemplo.
Ainda existe uma variável estática (que está dentro da classe Exemplo), guardando a referência do Singleton. E o que o autor do tópico perguntou e se há um jeito de eliminar a existência de um objeto, em definitivo. No caso do Singleton, estou tentando demonstrar que não há. Ou melhor até há, mais é muito mais difícil do que com um objeto comum.
Era essa variável que o método killMySelf() tentava apagar exatamente a referência estática, interna e na classe, que mantém o Singleton vivo. E por isso causava a duplicação do Singleton.
Puts agora vi a caca, realmente me enganei, exemplo = null, estou passando null apenas para a variavel exemplo.
Realmente nao mata o bixo, porem o que teremos é um Singleton Eterno, mas unico, sem o killMySelf.
|
Não respondo dúvidas via MP! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2008 09:19:40
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline
|
eclipso wrote:Este seu aplicativo seria o que exatamente? Uma thread? Um aplicativo desktop stand-alone? Um aplicativo desktop cliente-servidor?
Você fala dessa classe como se ela fosse algo dissociado do seu aplicativo. Porque diz "quando fechar" e "quando iniciar o aplicativo", e em seguida diz que independente de fechar ou reiniciar o aplicativo a classe deve ficar "rodando"...
Daria pra resolver relativamente fácil adotando a arquitetura cliente-servidor, mas não sei exatamente qual é a natureza da aplicação...
Abraço...
O meu aplicativo tem uma interface web, que roda em cima do Tomcat 6, esta classe ela é dissociada, eu queria rodar ela com o comando "java pacote.Classe", só que não consegui fazer. Eu tinha um ".sh" que inicializava este aplicativo, só que não gostei muito da solução e resolvi fazer esta interface.
Eu tentei executar o .sh pela minha action, o arquivo .sh é executado só que o aplicativo não é inicializado, porque no .sh eu tenho um retorno que me diz que foi executado.
E ai agora estou tentanto fazer desta maneira tudo dentro do tomcat 6 aonde eu teria que ter o controle desta instancia, que ficaria como um processo na máquina.
|
www.bau-de-dev.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2008 16:42:44
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline
|
Estou matando a instância da classe mas ela não para. Esta classe gera outras threads, a classe principal morrendo as threads filhas dela morrem também?
|
www.bau-de-dev.com |
|
|
 |
|
|