-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
122 lines (77 loc) · 4.08 KB
/
Solution.java
File metadata and controls
122 lines (77 loc) · 4.08 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//I [am] he that liveth, and was dead; and, behold, I am alive for evermore, Amen; and have the keys of hell and of death. (Revelation 1:18)
package com.javarush.task.task34.task3408;
/*
Кэширование
*/
public class Solution {
public static void main(String[] args) throws Exception {
SomeKey someKey = new SomeKey();
someKey.name = "test";
SomeKey someKeyNew = new SomeKey();
someKeyNew.name = "testNew";
SomeValue value = new SomeValue(someKey);
Cache<SomeKey, SomeValue> cache = new Cache<>();
cache.put(value);
SomeValue valueFromCacheExisted = cache.getByKey(someKey, SomeValue.class);
System.out.println(valueFromCacheExisted);
SomeValue valueFromCacheNew = cache.getByKey(someKeyNew, SomeValue.class);
System.out.println(valueFromCacheNew);
System.out.println(cache.size());
/* expected output:
SomeValue{myKey=SomeKey{name='test'}}
SomeValue{myKey=SomeKey{name='testNew'}}
2
*/
}
public static class SomeKey {
String name;
@Override
public String toString() {
return "SomeKey{" +
"name='" + name + '\'' +
'}';
}
}
public static class SomeValue {
private SomeKey myKey;
public SomeValue() {
}
public SomeValue(SomeKey myKey) { //use this constructor
this.myKey = myKey;
}
private SomeKey getKey() {
return myKey;
}
@Override
public String toString() {
return "SomeValue{" +
"myKey=" + myKey +
'}';
}
}
}
/*
Кэширование
Класс Cache - универсальный параметризированный класс для кеширования объектов.
Он работает с классами (дженерик тип Т), у которых обязан быть:
а) публичный конструктор с одним параметром типа K;
б) метод K getKey() с любым модификатором доступа.
Задание:
1. Выбери правильный тип для поля cache. Map<K, V> cache должен хранить ключи, на которые есть активные ссылки.
Если нет активных ссылок на ключи, то они вместе со значениями должны автоматически удаляться из cache.
2. Реализуй логику метода getByKey:
2.1. Верни объект из cache для ключа key.
2.2. Если объекта не существует в кэше, то добавьте в кэш новый экземпляр используя рефлексию, см. пункт а).
3. Реализуй логику метода put:
3.1. Используя рефлексию получи ссылку на метод, описанный в пункте б).
3.2. Используя рефлексию разреши к нему доступ.
3.3. Используя рефлексию вызови метод getKey у объекта obj, таким образом ты получишь ключ key.
3.4. Добавь в кэш пару <key, obj>.
3.5. Верни true, если метод отработал корректно, false в противном случае. Исключения игнорируй.
Требования:
1. Поле cache должно быть инициализировано объектом типа WeakHashMap.
2. Метод getByKey должен возвращать объект из кеша.
3. Метод getByKey должен добавлять объект в кеш если его там нет.
4. Метод put должен извлекать из переданного объекта ключ и добавлять в кеш пару .
5. Метод put должен возвращать true, если он отработал корректно, иначе false.
*/