Gibt es eine Situation, in der es besser wäre, schwache Referenzen anstelle einer einfachen Komposition zu verwenden?

10

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?

Kobold
quelle
Logikfehler: "... willkürliche Entscheidung basierend auf dem Willen, nur das verdammte Ding zu benutzen. Mit anderen Worten - ein schlechtes Design." Die Ziele rechtfertigen möglicherweise nicht die Mittel, aber die Mittel reichen nicht aus, um die Ziele zu widerlegen. Bei gleichen Methoden könnte das Ergebnis hypothetisch ein gutes Design sein. Für diesen Fall würde ich es jedoch nicht argumentieren. :)
cwharris
3
Schwache Referenzen sind ein orthogonales Konzept für Zusammensetzung und Vererbung.
Robert Harvey

Antworten:

13

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.

Erik Eidt
quelle
Warum zählt die Verwendung von Datenobjekten mit einer Metadatentabelle mit schwacher Hashmap-Unterstützung nicht als Komposition?
Jack
2
@ Jack, Komposition, insbesondere "einfache Komposition" in meinem Kopf, sind Objekte, die sich auf andere Objekte beziehen, aber direkt. Die "has-a" -Beziehung der Komposition wird unter Verwendung einer einfachen Referenz oder manchmal einer Sammlung ausgedrückt. Hier ist die Hashmap eine indirekte Methode. Sie können den Schmuck nicht erreichen, wenn Sie die Hashmap nicht haben. In der Komposition können Sie diese Navigation durchführen. Daher nenne ich diese Metadaten lieber einen Schmuck als eine Komposition, aber sie sind sicherlich verwandt. FWIW, der Schmuck komponiert (IMHO) mit den Daten, nur nicht umgekehrt.
Erik Eidt
@Jack, re: meine letzte FWIW, ich habe gerade festgestellt, dass Sie bei Verwendung der schwachen Hashmap normalerweise keinen Verweis vom Metadaten-schmückenden Objekt auf das andere setzen würden, weil der Speicher gespeichert ist (oder wenn Sie das Has-A darin haben wollten Richtung müsste es eine schwache Referenz sein). Daher arbeitet der schwache Hashmap-Client normalerweise mit zwei Objekten, die effektiv miteinander gepaart sind, sich aber technisch nicht in der Objektzusammensetzung befinden.
Erik Eidt