通常、キャッシュはオブジェクトをしばらくの間保持し、後でオブジェクトを公開する必要があります。オブジェクトを保持する適切なタイミングは、ユースケースによって異なります。私はこのことを単純なものにしたかったので、スレッドやスケジューラは必要ありませんでした。このアプローチは私にとってはうまくいきます。とは異なりSoftReference
、オブジェクトは最小限の時間で利用できることが保証されています。ただし、太陽が赤い巨人に変わるまでは、記憶に残りません。
使用例として、要求がごく最近行われたかどうかを確認でき、多忙なユーザーがボタンを数回押した場合でも、要求されたアクションを2回実行しない、応答の遅いシステムを考えます。ただし、後で同じアクションが要求された場合は、再度実行する必要があります。
class Cache<T> {
long avg, count, created, max, min;
Map<T, Long> map = new HashMap<T, Long>();
/**
* @param min minimal time [ns] to hold an object
* @param max maximal time [ns] to hold an object
*/
Cache(long min, long max) {
created = System.nanoTime();
this.min = min;
this.max = max;
avg = (min + max) / 2;
}
boolean add(T e) {
boolean result = map.put(e, Long.valueOf(System.nanoTime())) != null;
onAccess();
return result;
}
boolean contains(Object o) {
boolean result = map.containsKey(o);
onAccess();
return result;
}
private void onAccess() {
count++;
long now = System.nanoTime();
for (Iterator<Entry<T, Long>> it = map.entrySet().iterator(); it.hasNext();) {
long t = it.next().getValue();
if (now > t + min && (now > t + max || now + (now - created) / count > t + avg)) {
it.remove();
}
}
}
}