일반적으로 캐시는 객체를 일정 시간 동안 유지해야하며 나중에 다시 노출해야합니다. 무엇 개체를 유지하는 좋은 시간은 사용 사례에 따라 달라집니다. 나는 스레드 나 스케줄러가없는이 일을 간단하게 원했습니다. 이 방법은 저에게 효과적입니다. SoftReference
s 와 달리 객체는 최소한의 시간 동안 사용할 수 있습니다. 그러나 태양이 붉은 거인으로 변할 때까지 기억 속에 남아 있지 마십시오 .
사용 예제에서 요청이 아주 최근에 수행되었는지 여부를 확인할 수있는 느린 응답 시스템을 생각해보십시오.이 경우에는 바쁜 사용자가 버튼을 여러 번 누르더라도 요청 된 조치를 두 번 수행하지 않아야합니다. 그러나 얼마 후 같은 행동이 요청되면 다시 수행되어야한다.
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();
}
}
}
}