Я только что наткнулся на этот ответ в SO, где упоминается, что коллекции Google MapMaker является awesome.I просмотрел документацию, но не мог понять, где я могу ее использовать. Можно ли указать какой-то сценарий, где было бы целесообразно использовать MapMaker.
Использование коллекций Google MapMaker?
Ответ 1
Вот пример, который я использовал MapMaker
:
private final ConcurrentMap<Long, Foo> fooCache = new MapMaker()
.softValues()
.makeComputingMap(new Function<Long, Foo>() {
public Foo apply(Long id) {
return getFooFromServer(id);
}
});
public Foo getFoo(Long id) {
return fooCache.get(id);
}
Когда на карте вызывается get(id)
, он либо вернет Foo
, который находится на карте для этого идентификатора, либо будет извлекать его с сервера, кэшировать и возвращать. Я не должен думать об этом, как только он будет создан. Кроме того, поскольку я установил softValues()
, кеш не может заполнить и вызвать проблемы с памятью, так как система может очищать записи от него в ответ на потребности памяти. Если кешированное значение очищается от карты, однако, он может просто попросить сервер для него снова в следующий раз, когда он вам понадобится!
Дело в том, что это один из способов его использования. Возможность использования карты сильными, слабыми или программными клавишами и/или значениями, а также возможностью удаления записей через определенное время, позволяет делать с ней много вещей.
Ответ 2
Это может помочь, если вы посмотрите описания SoftReference
и WeakReference
.
SoftReference
очень полезен для использования в кэшах, поскольку они будут очищены, когда память станет низкой.
WeakReference
сообщает сборщику мусора, что он может собирать объект, на который он ссылается, пока нет сильных ссылок на него в другом месте. Обычно это используется с вещами, которые могут быть быстро просмотрены по мере необходимости.
Итак, рассмотрите возможность использования MapMaker для создания ConcurrentMap с softValues для кеша и одного со слабыми ключами для временных таблиц поиска.
Изменить: softValues использует политику LRU.