Ich habe mich nach einer Java-Liste, einem Set oder etwas Ähnlichem umgesehen, bei dem Einträge nach einer bestimmten Zeitspanne ablaufen, aber ich habe noch keine gefunden. Ich habe Guava's gefunden CacheBuilder
was für meine Zwecke fast perfekt wäre, aber es handelt sich um eine Karte und nicht um eine Liste oder ein Set. Gibt es so etwas bereits, oder muss ich es selbst erstellen, wenn ich es verwenden möchte?
Antworten
Zu viele Anzeigen?
Paddy
Punkte
599
Jaumzera
Punkte
2168
Sie könnten eine Auflistung Implementierung zu tun, dass zu schmücken. Etwas wie dies:
public class ExpirableArrayList<E> extends ArrayList<E> {
private final Date creation = new Date();
private final long timeToLiveInMs;
public ExpirableArrayList(long timeToLiveInMs, int initialCapacity) {
super(initialCapacity);
this.timeToLiveInMs = timeToLiveInMs;
}
public ExpirableArrayList(long timeToLiveInMs) {
this.timeToLiveInMs = timeToLiveInMs;
}
public ExpirableArrayList(long timeToLiveInMs, Collection<? extends E> c) {
super(c);
this.timeToLiveInMs = timeToLiveInMs;
}
private void expire() {
if (System.currentTimeMillis() - creation.getTime() > timeToLiveInMs) {
clear();
}
}
@Override
public int size() {
expire();
return super.size();
}
@Override
public boolean isEmpty() {
expire();
return super.isEmpty();
}
@Override
public boolean contains(Object o) {
expire();
return super.contains(o);
}
@Override
public Iterator<E> iterator() {
expire();
return super.iterator();
}
@Override
public Object[] toArray() {
expire();
return super.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
expire();
return super.toArray(a);
}
@Override
public boolean add(E e) {
expire();
return super.add(e);
}
@Override
public boolean remove(Object o) {
expire();
return super.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
expire();
return super.contains(c);
}
@Override
public boolean addAll(Collection<? extends E> c) {
expire();
return super.addAll(c);
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
expire();
return super.addAll(index, c);
}
@Override
public boolean removeAll(Collection<?> c) {
expire();
return super.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
expire();
return super.retainAll(c);
}
@Override
public E get(int index) {
expire();
return super.get(index);
}
@Override
public E set(int index, E element) {
expire();
return super.set(index, element);
}
@Override
public E remove(int index) {
expire();
return super.remove(index);
}
@Override
public int indexOf(Object o) {
expire();
return indexOf(o);
}
@Override
public int lastIndexOf(Object o) {
expire();
return lastIndexOf(o);
}
@Override
public ListIterator<E> listIterator() {
expire();
return listIterator();
}
@Override
public ListIterator<E> listIterator(int index) {
expire();
return listIterator();
}
@Override
public List<E> subList(int fromIndex, int toIndex) {
expire();
return subList(fromIndex, toIndex);
}
}
Absurd-Mind
Punkte
7612
Da die Java-HashSet-Implementierung intern eine HashMap verwendet, sollte es sehr einfach sein, den Code so zu kopieren/zu ä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 Sie einfach Ihre SetWithExpiration
als CacheBuilder
Abbildung von Schlüssel zu Schlüssel. Dies wird nicht mehr Effizienz verlieren als die Java HashSet
Umsetzung verliert durch die Verwendung eines zugrunde liegenden HashMap
.