Вопрос
Вариант использования корреляции:
read input
if (correlation-id is already generated for this input)
{
lookup the correlation-id from the cache;
return correlation-id;
}
else
{
generate the correlation-id;
cache it;
return correlation-id;
}
Ограничения:- Количество входных записей может пройти до 500K, поэтому не хочет использовать сильные ссылки.-Не хочет генерировать хэши с односторонним движением на данный момент (я знаю, что если мы используем односторонний хэш, то нет необходимости в кеше)
Может кто-нибудь сказать мне, как использовать ComputingMap для этого.Я спрашиваю об этом, потому что в Javadoc есть записка, в которой говорится: «Он использует равенство идентификации для слабых/мягких клавиш».
Решение
С классами Google Guava/Collection и мягкими или слабыми ключами или значениями ваши ключи должны быть сильными ссылками, чтобы карта могла использовать равенства(), а не == для поиска кэшированных значений.Если у вас есть слабые/мягкие клавиши, поиск выполняется по идентификатору, поэтому вы всегда будете получать промахи в кеше.Поэтому, если вы хотите, чтобы сборщик мусора собирал элементы из вашего кэша, вам нужно сделать значения мягкими или слабыми.
Я понимаю, что Google добавит функцию эквивалентности в будущем, чтобы вы могли указать, хотите ли вы равны () или ==, и не делать этот выбор за вас, выбирая сильные, слабые или мягкие ссылки.
Поскольку ваш объект Tuple реализует методы равенства() и hashCode(), вы просто выполняете
new MapMaker()
.softValues()
.makeComputingMap(new Function<Tuple,String>() {
public String apply(Tuple t) {
// generate the correlation-id
}
});