Мне нужно получить результат медленного метода slowResult()
для экземпляров класса Something
. Кэширование само по себе не помогает, поскольку экземпляры почти никогда не повторяются. К счастью, я знаю, что результат на самом деле зависит только от некоторых легко получаемых Attributes
из Something
, поэтому я мог бы использовать Map<Attributes, Result>
в качестве кэша в коде
Result fastResult(Something something) {
final Attributes attributes = attributesFor(something)
Result result = cache.get(attributes);
if (result!=null) return result;
result = something.slowResult();
cache.put(attributes, result);
return result;
}
Чтобы ограничить кеш, я использовал устаревшие методы maximumSize
и expireAfterAccess
. Устаревание происходит из-за того, что вместо него будет использоваться новый класс CacheBuilder
. Однако я не нашел хорошего способа применить его к моему делу. Ключи кеша должны быть экземплярами Attributes
, но при загрузке кеша требуется экземпляр Something
, и нет простого способа воссоздать его из Attributes
.
Есть ли хорошее решение этой проблемы?
slowResult
. Если быSomething
был огромным объектом, это тоже было бы проблемой. 02.10.2011