Itens do Set desaparecem misteriosamente

5 respostas
InSeOfKn

Olá!
Ontem desenvolvendo um projeto, no qual estava utilizando o padrão observer ocorreu um fato estranho, bom vamos aos fatos

no projeto tem as class
:arrow: AgendaController que é o Source
:arrow: AgendaListener que é a interface listener
:arrow: AgendaEvent que é o objeto Evento
:arrow: AgendaTableModel que implementa o AgendaListener

acontece que ao adicionar o AgendaTableModel nos interessados das mudanças do AgendaController ele adicionava normalmente (verificado imprimindo a quantidade de elementos do Set após adicionar) mas na hora de notificar os interessados o elemento não estava mais no Set (verificado imprimindo a quantidade de elementos do Set), realmente isso é muito estranho e não sei porque isso acontece, mas sei que foi resolvido de uma maneira muito simples, passei a guardar a referencia de AgendaTableModel em uma variável global em vez de instanciar diretamente no parâmetro do construtor do JTable.
Acredito que o que estava acontecendo é que por não estar guardando uma referencia do AgendaTableModel o GarbageCollector acabava excluindo-o, mas por outro lado acredito que esse não seja o motivo pois tanto o Set, quanto o JTable estavam guardando uma referencia do AgendaTableModel.

Bom o fato é que eu não sei o motivo disso ter acontecido e que por sorte acabei resolvendo, mas gostaria de saber exatamente o porque isso aconteceu, para evitar problemas semelhantes no futuro.

Alguém saberia explicar??

Até!

[ops] relendo acabei percebendo que ficou longo demais agradeço por ter lido até aqui!!

5 Respostas

nel

Oi!

Pode haver 3 milhões de motivos que causam esse “mistério”.
Mas para que possamos ter uma noção do que possa vir a estar acontecendo, além do que foi descrito, se faz necessário analisarmos seu código, sendo assim, poste-o, fica mais simples de ajudarmos ok?

Abraços.

ViniGodoy

Cuidado: uma vez dentro do set, os elementos não deveriam mudar a propriedade que os identifica dentro do set.

Ou seja, se você tem um HashSet, os elementos não deveriam alterar seu HashCode. Se você tem um TreeSet, os elementos não podem alterar atributos que mudem o valor de sua comparação. Portanto, nada de chamar setters em elementos que estão num set.

Se isso ocorrer, o Set não será mais capaz de encontrar o elemento. Se você precisa que os componentes continuem mutáveis, use um List.

InSeOfKn

Peço minhas sinceras desculpas, pois o projeto evoluiu e teve algumas modificações e eu não consegui voltar a configuração que estava o programa quando o problema ocorreu.
(percebi que a correção do problema não foi exatamente guardar a referencia em uma variável global, pois removi essa referencia agora e não voltou a ocorrer o problema :? ).

nel, como explicado acima acho que agora não adianta mais postar o código pois ele esta funcionando exatamente como o esperado.

ViniGodoy, dessa eu não sabia! mas estou usando o CopyOnWriteArraySet que em alguns lugares recomendam pra guardar os Listener, nesse caso qual seria os valores que os identificam no Set??

e no meu caso é o TableModel que implementa esse Listener logo ele tem muitos Setter’s isso poderia me causar problemas?

Abrigado pela atenção de todos e mais uma vez minhas desculpas.

Até!

ViniGodoy

É difícil dizer. Isso pode variar de listener para listener.

InSeOfKn

Desculpa pela demora, meu PC queimou, e só agora voltei a acessar o GUJ

bom, mas voltando ao assunto depende do que?
procurei na documentação algo que seja a referencia do Set no CopyOnWriteArraySet como o HastCode é na HastSet mas não encontrei, saberias me dizer o que dos meus listener não pode mudar?

só pra constar quem implementa meu listener é um TableModel, e ele muda toda vez que o listener é acionado.

Até!

Criado 8 de agosto de 2011
Ultima resposta 15 de ago. de 2011
Respostas 5
Participantes 3