Embora os docs Java especificar, que as referências fracas são principalmente para Canonicalização mapeamentos, você vai encontrar muitas , muitas , muitas pessoas na internet afirmando, que o WeakHashMap é perfeito para armazenar metadados objeto durante sua vida útil. No entanto, ninguém se preocupa em fazer um exemplo compreensível e apropriado .
Usar o WeakHashMap para adicionar ao objeto algumas propriedades ou armazenar sons de metadados para mim, como uma decisão arbitrária baseada na vontade de usar apenas essa coisa. Em outras palavras - um design ruim . Entendo que há situações em que a herança pode não estar disponível (classes finais, interfaces), mas e a composição? Não consigo pensar em um exemplo em que a composição não seria uma opção. E certamente melhor, porque se baseia em um princípio bem estabelecido, em vez de uma "peculiaridade da linguagem".
Então, existe uma situação em que seria melhor usar referências fracas em vez de composição simples? Se não, por que todos na internet parecem errar?
fonte
Respostas:
Digamos que eu precise associar alguns metadados a alguns objetos de dados. Este é um cenário bastante comum. Eu não controlo os objetos de dados, e há muitos deles, e a API em questão (retornos de chamada, métodos virtuais, etc.) me oferece esses objetos de dados, mas sem meus metadados. Portanto, preciso rastrear algum estado para cada um desses objetos de dados, a saber, os que já vi antes e que podem ver novamente. Vou chamar esses metadados de adorno, que é um termo usado algumas vezes para esse conceito.
A composição simples fornece uma pesquisa fácil do objeto adornado (aquele com metadados) para o outro objeto (aquele com dados), com a presunção de que, desde que eu controle o design do objeto de metadados, posso colocar nele uma referência diretamente ao objeto de dados .
No entanto, a menos que você controle o design do objeto de dados e possa alterá-lo, a composição simples não fornece a pesquisa inversa (do objeto de dados para alguns metadados). De fato, a menos que você tenha uma coleção dos objetos de metadados, não poderá nem localizar o item de metadados associado, dado um item de objeto (dados).
Além do problema de pesquisa na direção que vai do objeto para encontrar seus metadados decorativos, também há o problema da vida útil dos metadados.
Os metadados que se acumulam e nunca são liberados, mesmo quando o objeto de dados não é mais usado, é um vazamento de memória.
Um hashmap de referência fraco resolve os dois problemas. Ele permite localizar os metadados dados aos dados e permite que os metadados sejam liberados algum tempo após a liberação dos dados.
Observe ainda que um hashmap de referência fraco permite que não apenas os valores (metadados) sejam recuperados (gc'ed), mas também as chaves (dados) sejam recuperadas (gc'ed), pois se as chaves fossem mantidas, isso também seria um vazamento de memória e, além disso, os valores também nunca poderiam ser liberados.
fonte