скажем, у нас есть объект CountryList в нашем приложении, который должен вернуть список стран. Загрузка стран - это тяжелая операция, поэтому список следует кэшировать.
Дополнительные требования:
- CountryList должен быть потокобезопасным
- CountryList должен загружать ленивый (только по запросу)
- CountryList должен поддерживать недействительность кэша
- CountryList должен быть оптимизирован с учетом того, что кеш будет крайне недействительным
Я придумал следующее решение:
public class CountryList {
private static final Object ONE = new Integer(1);
// MapMaker is from Google Collections Library
private Map<Object, List<String>> cache = new MapMaker()
.initialCapacity(1)
.makeComputingMap(
new Function<Object, List<String>>() {
@Override
public List<String> apply(Object from) {
return loadCountryList();
}
});
private List<String> loadCountryList() {
// HEAVY OPERATION TO LOAD DATA
}
public List<String> list() {
return cache.get(ONE);
}
public void invalidateCache() {
cache.remove(ONE);
}
}
Что вы думаете об этом? Вы видите что-то плохое? Есть ли другой способ сделать это? Как я могу сделать это лучше? Должен ли я искать совершенно другое решение в этом случае?
Спасибо.