Existe uma situação em que seria melhor usar referências fracas em vez de composição simples?


10

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?


Erro de lógica: "... decisão arbitrária baseada na vontade de usar apenas a coisa maldita. Em outras palavras - um design ruim." Os fins podem não justificar os meios, mas os meios não são suficientes para controvertê-los. Dado os mesmos métodos, o resultado poderia ser hipoteticamente um bom design. Embora neste caso eu não discuta. :)
cwharris

3
Referências fracas são um conceito ortogonal para composição e herança.
Robert Harvey

Respostas:


13

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.


Por que o uso dos objetos de dados com uma tabela de metadados suportados por hashmap fraco conta como composição?
Jack

2
@ Jack, Composition, especialmente "composição simples" em minha mente, pelo menos, são objetos que se referem a outros objetos, mas diretamente. A relação de composição "tem-a" é expressa usando uma referência simples ou, às vezes, uma coleção. Aqui o hashmap é um método indireto. Você não pode alcançar o adorno se não tiver o hashmap. Enquanto na composição você pode fazer essa navegação. Portanto, prefiro chamar esses metadados de adorno ao invés de composição, mas eles certamente estão relacionados. FWIW, o adorno (IMHO) compõe com os dados, mas não o contrário.
Erik Eidt

@Jack, re: meu último FWIW, eu acabei de perceber que, ao usar o hashmap fraco, você normalmente não colocaria uma referência dos metadados que adornam o objeto para o outro por causa da retenção de memória (ou se você queria o has-a naquele direção, teria que ser uma referência fraca). Portanto, normalmente o cliente de hashmap fraco trabalha com dois objetos efetivamente emparelhados entre si, mas que não estão tecnicamente na composição do objeto.
Erik Eidt 8/17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.