Pegar a instancia de uma classe  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
ViniGodoy
Moderador
[Avatar]

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
[WWW]
fredferrao
GUJ Master
[Avatar]

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!
ViniGodoy
Moderador
[Avatar]

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
[WWW]
fredferrao
GUJ Master
[Avatar]

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!
ViniGodoy
Moderador
[Avatar]

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
[WWW]
fredferrao
GUJ Master
[Avatar]

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!
Jedi_FeniX
Virtual Machine Man
[Avatar]

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
Jedi_FeniX
Virtual Machine Man
[Avatar]

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
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team