Este código irá criar uma condição onde o objeto pai nunca estará disponível para gc?
classPai{Vector<Filho>filhos=newVector<Filho>;publicvoidnewFilho(){filhos.add(newFilho(this));}}classFilho{Paipai;publicFilho(Paipai){this.pai=pai;}}Paipai=newPai();pai.newFilho();System.gc();// 'pai' ainda existe?
Enquanto houver referencias fortes para o objeto pai, ele não sera recolhido.
Eu fiz um exemplo usando java.lang.ref.WeakReferences:
classTeste{//falta um nome melhor...publicstaticWeakReference<Pai>xxx(){Paipai=newPai();WeakReference<Pai>ref=newWeakReference<Pai>(pai);pai.newFilho();returnref;}publicstaticvoidmain(String...x){Runtimer=Runtime.getRuntime();WeakReference<Pai>ref=xxx();r.gc();if(ref.get()==null){System.out.println("pai foi recolhido pelo garbage collector");}else{System.out.println("pai ainda existe");}}}
Comente o r.gc() e veja a diferença. Espero não estar enganado quanto ao meu exemplo e ao codigo, afinal a api de references eu não domino totalmente.
PauloBrito
Beleza, peczenyj. Adaptei seu exemplo ao meu anterior e deu pra ver que funciona mesmo. Eu estava usando WeakReferences no meu projeto, mas de uma maneira completamente equivocada, confesso.
Uma última dúvida: esta é a maneira mais usual de referenciar um objeto acima na hieraquia? Por exemplo:
Há alguma forma melhor de fazer isso ou só usando WeakReferences mesmo?
peczenyj
Vou te responder de uma forma totalmente superficial: sua forma de processar tais informações, aparentemente, abusam do paradigma imperativo - o que não é ruim. São muitos ifs. Vc poderia estudar uma forma de trabalhar com o Pattern Strategy ou utilizar um “motor de regras”, um rule engine tipo o Drools ou algo mais simples como hashtables de regras.
ex (pseudocodigo):
teclado[TiposTeclado.ABNT2][223]='ç';
Outra coisa, o tipo do Teclado ser uma string é um pouco “pobre”. IMHO vc poderia ter uma Enumeração de tipos, coisa que o java suporta desde a versão 5. Evita, por exemplo, vc ter problemas com ABNT2 e abnt2 ou ABnT2. Se não puder ter enumerações (java 1.4 ou inferior), pode ter atributos publicos finais de uma classe ou interface para representar estas constantes.
De uma lida no algoritmo de RETE, talvez te dê algumas ideias interessantes. Sinto não poder ajudar mais.
PauloBrito
Este código “do teclado” foi só uma maneira de exemplificar o uso da referência ao container. Mas obrigado pelas dicas.
peczenyj
Pois então, fico pensando pq vc gostaria de ter uma weakreference desse objeto, aparentemente ele é nobre demais para vc se dar ao luxo de perde-lo via garbage collector.
Vc esta trabalhando com situações criticas tipo pouca memória?
PauloBrito
Na verdade não gostaria! Mas parece que é o único modo de não causar vazamento de memória, seu eu preciso de referência circular.