Allgemeiner InternPoolT in Java?

8

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.

    
Rusty Cuntz 24.07.2010, 04:22
quelle

6 Antworten

5

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.

    
Stephen C 24.07.2010 04:58
quelle
4

Für ein Beispiel werfen Sie einen Blick auf Interner von Guava . Es erfordert nicht eine Internable Schnittstelle, sondern nur equals und hashCode .

    
finnw 24.07.2010 09:58
quelle
3

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%     
Peter Verhas 26.02.2014 14:14
quelle
2

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.

    
BalusC 24.07.2010 04:30
quelle
1

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.

    
simon.watts 27.10.2014 11:26
quelle
0

Sollte nicht

"WeakReference ref = pool.get (Objekt);"

sollte stattdessen

sein

WeakReference ref = pool.intern (Objekt);

??

    
FrederikH 10.09.2015 15:47
quelle

Tags und Links