Wie würde ich eine generische InternPool<T>
in Java schreiben? Benötigt es eine Internable
Schnittstelle?
String
in Java verfügt über Internierungsfunktionen; Ich möchte Klassen wie BigDecimal
und Account
internieren.
In etwa so:
%Vor% Dies hängt von der Poolelementklasse ab, die equals
und hashCode
implementiert, um "Gleichheit nach Wert" bereitzustellen und den API-Verträgen für diese Methoden zu folgen. Aber BigDecimal
macht es sicherlich.
UPDATE - Für eine Erklärung, warum wir ein WeakHashMap<T, WeakReference<T>>
anstatt eines WeakHashMap<T, T>
benötigen, siehe javadocs . Die kurze Version ist, dass die Schlüsselschwachstellen in der letzteren nicht durch den GC gebrochen werden, weil die entsprechenden Eintragsreferenzen die Werte stark erreichbar machen.
Ich würde die Lösung in zwei Klassen aufteilen, um saubereren Code zu haben und auf diese Weise loop loszuwerden:
%Vor%und die Internierungsklasse, die den schwachen Pool verwendet, ist sehr einfach:
%Vor%Das klingt eher nach dem Fliegengewichtsmuster .
Flyweight ist ein Softwaredesignmuster. Ein Fliehgewicht ist ein Objekt, das den Speicherverbrauch minimiert, indem es so viele Daten wie möglich mit anderen ähnlichen Objekten teilt.
Klicken Sie auf den Link, er enthält ein Java-Beispiel.
Nur ein kleiner Vorbehalt:
Es wurde oben nicht explizit erwähnt, aber es sollte offensichtlich sein, dass die Objekte, die intern sind, von einem unveränderlichen -Typ sein müssen.
Zu einer zweiten Bemerkung: Sie brauchen keinen anderen schwachen Verweis auf das Objekt als Wert in der Karte, ein Verweis auf eine statische würde ausreichen, wenn Sie sich nur auf den Schlüsselsatz der Karte für die Daten verlassen. Deklarieren Sie beispielsweise:
%Vor%Und fügen Sie Paare wie folgt ein:
%Vor%Dies ist eine geringfügige Speicherung einer WeakReference-Instanz (wenn Sie die für den Schlüssel verwendete nicht verwenden können).
... oder erstellen Sie eine WeakSet-Klasse, wie es @PeterVerhas mit seinem WeakPool gemacht hat.
Tags und Links java generics object-pooling