Obwohl in den Java-Dokumenten angegeben ist, dass schwache Referenzen in erster Linie zur Kanonisierung von Zuordnungen dienen, finden Sie im Internet viele , viele , viele Leute, die angeben, dass die WeakHashMap perfekt zum Speichern von Objektmetadaten während ihrer Lebensdauer geeignet ist. Es stört jedoch niemanden, ein verständliches UND angemessenes Beispiel zu geben.
Die Verwendung von WeakHashMap zum Hinzufügen von Objekten zu einigen Eigenschaften oder zum Speichern von Metadaten klingt für mich wie eine willkürliche Entscheidung, die auf dem Willen basiert, nur das verdammte Ding zu verwenden. Mit anderen Worten - ein schlechtes Design . Ich verstehe, dass es Situationen gibt, in denen Vererbung möglicherweise nicht verfügbar ist (Abschlussklassen, Schnittstellen), aber was ist mit der Komposition? Ich kann mir kein Beispiel vorstellen, bei dem Komposition keine Option wäre. Und sicherlich ein besseres, weil es sich auf ein etabliertes Prinzip stützt, anstatt auf eine "Sprach-Eigenart".
Gibt es also eine Situation, in der es besser wäre, schwache Referenzen anstelle einer einfachen Komposition zu verwenden? Wenn nicht, warum scheint es jeder im Internet falsch zu verstehen?
quelle
Antworten:
Angenommen, ich muss einigen Datenobjekten einige Metadaten zuordnen. Dies ist ein ziemlich häufiges Szenario. Ich kontrolliere die Datenobjekte nicht und es gibt viele davon, und die betreffende API (Rückrufe, virtuelle Methoden usw.) bietet mir diese Datenobjekte an, jedoch ohne meine Metadaten. Daher muss ich für jedes dieser Datenobjekte einen Status verfolgen, nämlich die, die ich zuvor gesehen habe und möglicherweise wieder sehen werde. Ich werde diese Metadaten als Schmuck bezeichnen, was manchmal für dieses Konzept verwendet wird.
Die einfache Komposition ermöglicht eine einfache Suche vom schmückenden Objekt (das mit Metadaten) zum anderen Objekt (das mit Daten), mit der Annahme, dass ich, da ich das Design des Metadatenobjekts steuere, darin einen Verweis direkt auf das Datenobjekt einfügen kann .
Sofern Sie das Design des Datenobjekts nicht steuern und ändern können, bietet die einfache Komposition keine umgekehrte Suche (vom Datenobjekt zu einigen Metadaten). Wenn Sie nicht über eine Sammlung der Metadatenobjekte verfügen, können Sie das zugehörige Metadatenelement bei einem Objekt (Daten) nicht einmal finden.
Neben dem Problem der Suche in der Richtung, in der das Objekt seine schmückenden Metadaten findet, gibt es auch das Problem der Lebensdauer der Metadaten.
Metadaten, die sich ansammeln und auch dann nicht freigegeben werden, wenn das Datenobjekt nicht mehr verwendet wird, sind ein Speicherverlust.
Eine schwache Referenz-Hashmap löst beide Probleme. Es ermöglicht das Auffinden der Metadaten anhand der Daten und das Freigeben der Metadaten zu einem bestimmten Zeitpunkt nach dem Freigeben der Daten.
Beachten Sie ferner, dass eine schwache referenzierende Hashmap nicht nur das Zurückfordern (gc'ed) von (Metadaten-) Werten ermöglicht, sondern auch das Zurückfordern von (gc'ed) von (Daten-) Schlüsseln, da dies auch a wäre, wenn die Schlüssel beibehalten würden Speicherverlust und außerdem konnten die Werte auch nie freigegeben werden.
quelle