Java-map, key = Klasse, Wert = Instanz der Klasse
Ich bin mir nicht sicher, was ich tun möchte, ist möglich, aber wenn es ist, ich möchte, um herauszufinden, wie. Im Grunde, will ich eine Karte erstellen, wo der Schlüssel ist, eine Klasse (java.lang.Class
), und den Wert für diesen Eintrag ist eine Instanz der Klasse. Derzeit habe ich
private Map<Class<?>, Object> myMap = new HashMap<Class<?>, Object>();
Dies bedeutet jedoch, dass ein beliebiges Objekt platziert werden können in die Karte. Wenn es möglich ist, ich will es machen, damit nur eine Instanz von der Klasse, in der Schlüssel platziert werden können in die Karte. Gibt es eine Möglichkeit, Sie zu benutzen ? Parametrisierung an die Klasse, um dies sicherzustellen?
Also, ich fand, es könnte ein mögliche memory leakwenn etwas wie das zu tun. Ich bin mir nicht sicher, ob ich vollständig verstehen, wie dies geschieht. Ich will nur festhalten singleton-Objekte in die Karte, so wäre es immer noch die Sorge für ein memory leak? Wenn ja, wie kann ich es verhindern?
InformationsquelleAutor der Frage dnc253 | 2012-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-Typ-system ist einfach nicht stark genug, um die Durchsetzung der Typ constraint-Sie beschreiben direkt, und Sie müssen tun, einige unsichere casts um diese Arbeit zu machen -- oder wickeln Sie die
Map
in eine andere API, die erzwingt die Art der Sicherheit. Guave istClassToInstanceMap
nicht nur, dass genau für diesen use-case, die Bereitstellung einer extern-sichere API, die erlegt zusätzliche Einschränkungen auf derMap
- Schnittstelle machen, damit es funktioniert. (Disclosure: ich trage zu Guave.)Das einzige mal, dies kann zu einem Speicherleck ist, wenn es einige Klassen, die Sie verwenden hier das würde nicht beibehalten werden, für die Lebensdauer der Anwendung. Dies ist nicht eine Sorge für viele Benutzer, vor allem, wenn Sie schreiben, ein "server-side" - Anwendung, die nicht so besorgt über die Entladung nicht verwendeten Klassen.
InformationsquelleAutor der Antwort Louis Wasserman
Können Sie ausblenden der Kollektion und nur ermöglichen es, auf die zugegriffen werden, die über accessor-Methoden.
Die Warnung kann ignoriert werden, da Sie wissen, die Besetzung in der letzten Methode ist sicher, auch wenn der compiler nicht.
InformationsquelleAutor der Antwort Peter Lawrey
Was Sie verwenden, ist ein heterogene container. Diese kann gemacht werden typesafe durch die Verwendung von type-Token (wie bisher) und
Class.cast()
mit der korrekten Anwendung der Logik: Also es ist ein ungeprüfter suppressWarning innerhalbClass.cast()
aber die Logik garantiert Fehlerfreiheit.Rate ich Ihnen, Lesen Sie Josh Bloch Effektiv Java Item 29: Betrachten Sie typesafe heterogenen Containern. Sein Beispiel ist:
Sehe ich nur eine Möglichkeit für Speicher Leckage wenn Sie halten Sie beliebig viele verschiedene Typen, die Sie eigentlich nicht mehr brauchen.
InformationsquelleAutor der Antwort DaveFar
Dies ist nicht möglich, da die type erasure.
Jedoch, Sie könnten Unterklasse
HashMap
und schreiben eine gewisse Logik in dieput
Methode, die dies für Sie tun:Code(nur zur Veranschaulichung)
InformationsquelleAutor der Antwort
Ich hatte die gleiche Anforderung. Ich löste es mit dem folgenden code :
InformationsquelleAutor der Antwort truekiller