public class SimpleCache {
private static long wideHits;
private static long wideMisses;
private Hashtable cache;
private Vector stamps;
private int maxSize;
private long hits;
private long misses;
public static long getWideHits() {
return wideHits;
}
public static long getWideMisses() {
return wideMisses;
}
public SimpleCache(final int size) {
this.maxSize = size;
cache = new Hashtable(size);
stamps = new Vector(size);
}
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(final int maxSize) {
this.maxSize = maxSize;
}
public int getSize() {
return cache.size();
}
public void add(final Object key, final Object object) {
final Hashtable cache = this.cache;
if (!cache.containsKey(key)) {
if (cache.size() == maxSize) {
discard();
}
cache.put(key, object);
stamps.insertElementAt(key, 0);
} else {
cache.put(key, object);
touch(key);
}
}
public void remove(final Object key) {
if (stamps.contains(key)) {
stamps.removeElement(key);
cache.remove(key);
}
}
public void clear() {
cache.clear();
stamps.removeAllElements();
hits = misses = 0;
}
public synchronized Object get(final Object key) {
final Object o = cache.get(key);
if (o != null) {
hits++;
wideHits++;
touch(key);
} else {
misses++;
wideMisses++;
}
return o;
}
public long getHits() {
return hits;
}
public long getMisses() {
return misses;
}
private void discard() {
final Object key = stamps.lastElement();
stamps.removeElement(key);
cache.remove(key);
}
private void touch(final Object key) {
stamps.removeElement(key);
stamps.insertElementAt(key, 0);
}
}