-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathLRUCache.java
More file actions
48 lines (39 loc) · 3.64 KB
/
LRUCache.java
File metadata and controls
48 lines (39 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//And there were set there six waterpots of stone, after the manner of the purifying of the Jews, containing two or three firkins apiece (John 2:6)
package com.javarush.task.task37.task3708.cache;
import java.util.LinkedHashMap;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
// Remove the eldest element whenever size of cache exceeds the capacity
return (size() > this.capacity);
}
public LRUCache(int capacity) {
// Call constructor of LinkedHashMap with accessOrder set to true to
// achieve LRU Cache behavior
super(capacity + 1, 1.0f, true);
this.capacity = capacity;
}
public V find(K key) {
return super.get(key);
}
public void set(K key, V value) {
super.put(key, value);
}
}
/*
Кеширующий Proxy
Реализация паттерна Proxy предоставляет объект, который контролирует доступ к другому объекту.
Тебе необходимо создать класс CachingProxyRetriever в пакете retrievers, который будет обеспечивать ту же функциональность что и класс OriginalRetriever, но с одним важным дополнением. Необходимо всегда пробовать сначала получить объект из кеша, и только если его там нет - выполнять дорогостоящую операцию загрузки из storage. После получения необходимого объекта из хранилища storage, его необходимо кешировать с помощью объекта типа LRUCache.
Для клиента (в данном случае класс Solution) использование CachingProxyRetriever ничем не должно отличаться от использования класса OriginalRetriever.
P.S. Тебе понадобятся поля типов LRUCache и OriginalRetriever в классе CachingProxyRetriever.
Требования:
1. В классе CachingProxyRetriever должно быть создано поле типа OriginalRetriever.
2. В классе CachingProxyRetriever должно быть создано поле типа LRUCache.
3. Конструктор класса CachingProxyRetriever должен принимать один параметр типа Storage и инициализировать поле типа OriginalRetriever.
4. Метод retrieve класса CachingProxyRetriever должен выполнять поиск подходящего объекта в кеше с помощью метода find.
5. Метод retrieve класса CachingProxyRetriever должен получать объект из хранилища с помощью метода retrieve объекта типа OriginalRetriever и добавлять в кеш, если он не был там найден.
6. Метод retrieve класса CachingProxyRetriever не должен вызывать метод retrieve класса OriginalRetriever, если объект был найден в кеше.
7. Метод retrieve класса CachingProxyRetriever должен возвращать объект, которому в хранилище соответствует id, полученный в качестве параметра.
8. Класс CachingProxyRetriever должен поддерживать интерфейс Retriever.
*/