2012-07-23 7 views
11

Ich habe nach einer Java-Liste, einem Set oder ähnlichem Ausschau gehalten, deren Einträge nach einem bestimmten Zeitraum ablaufen, aber ich muss noch einen finden. Ich habe Guavas CacheBuilder gefunden, was für mich fast perfekt wäre, aber dass es eher eine Karte als eine Liste oder ein Set ist. Gibt es da draußen schon etwas, oder muss ich eins machen, wenn ich es benutzen will?Java-Zeit abgelaufene Liste/Set?

+2

Was ist Ihr Anwendungsfall? – Bohemian

+0

Ich habe Schwierigkeiten, einen Anwendungsfall zu sehen. Wenn Sie Dinge zwischenspeichern möchten, benötigen Sie normalerweise einen Schlüssel zum Abrufen dessen, was zwischengespeichert wird. Daher funktioniert jede Cache-Implementierung mit der Map-Schnittstelle (oder etwas Ähnlichem). – Matt

+0

können Sie immer noch über das Set iterieren –

Antwort

0

Da die Java HashSet-Implementierung intern eine HashMap verwendet, sollte es sehr einfach sein, den Code so zu kopieren/ändern, dass er Guavas CacheBuilder verwendet.

public class HashSet<E> 
    extends AbstractSet<E> 
    implements Set<E>, Cloneable, java.io.Serializable 
{ 
    static final long serialVersionUID = -5024744406713321676L; 

    private transient HashMap<E,Object> map; 
... 

Mit anderen Worten, implementieren nur Ihre SetWithExpiration als CacheBuilder Karte von Taste zu Taste. Dies wird nicht mehr Effizienz verlieren als die Java HashSet Implementierung verliert durch Verwendung eines zugrunde liegenden HashMap.

+3

Nicht so einfach. Die "HashSet" -Klasse neu zu erfinden ist eine schlechte Idee, und Sie können "HashSet stattdessen nicht einfach einen CacheBuilder verwenden". – Bohemian

+0

Ja, die cleane Code-Lösung wäre, AbstractSet zu erweitern und intern eine Map zu verwenden, die von der Abhängigkeitsinjektion weitergegeben wird . –

5

Um CacheBuilder zu verwenden, um eine Zeit abgelaufen Liste zu erhalten, könnten Sie Ihre Objekte in der Karte als Schlüssel und einige Dummy-Objekt als Werte.

+1

Oder verwenden Sie Ihre Objekte als Schlüssel und Wert. Achten Sie jedoch darauf, für jeden Dummy kein neues Objekt zu erstellen, da dies eine Verschwendung wäre. –

Verwandte Themen