Подтвердить что ты не робот

Почему softKeys() устарел в Guava 10?

Как и в случае с Guava 10, MapMaker.softKeys устарел, а соответствующий метод не существует в CacheBuilder.

Почему было сделано это изменение? Что мне нужно сделать с существующим кодом, который его использует?

4b9b3361

Ответ 1

Я написал вопрос, потому что изначально я действительно задавался вопросом, почему (поскольку у меня был существующий код, который использовал softKeys). Однако причина была очевидна при отражении, и я решил опубликовать ее здесь, если кто-то еще использует softKeys и задавался вопросом то же самое.

Короче говоря, причина в том, что softKeys никогда не имел никакого смысла в первую очередь. Таким образом, его первоначальное включение было само по себе ошибкой, которое разработчики Guava исправляют с помощью устаревания.

В общем, вы используете мягкие ссылки, если хотите, чтобы объект оставался немного после того, как все сильные ссылки исчезли; напротив, со слабыми ссылками, объект обычно собирается вскоре после того, как нет сильных или мягких ссылок. Это полезно для кешированных значений, которые вы хотите временно удерживать, чтобы поиск с использованием соответствующего ключа "оживил" сильную ссылку для значения.

Однако это поведение не имеет никакого смысла для ключей:

  • Так как карты softKeys и weakKeys используют поиск на основе идентификации, единственный способ получить интересную запись - это сильная ссылка на его ключ. Таким образом, один раз нет сильных ключевых ссылок слева, запись фактически мертва (без возможности возрождения).
  • Единственное практическое различие между softKeys и weakKeys заключается в том, как долго запись остается на карте после исчезновения всех сильных ссылок на ее ключ. Так как такие записи все равно мертвы, использование softKeys вместо weakKeys только задерживает выселение записи без уважительной причины.

Таким образом, в большинстве случаев при использовании кода, использующего softKeys, гораздо более подходящей заменой является weakKeys.

† Я не рассматриваю случай извлечения записи через итерацию или что-то другое, кроме ключевого поиска, поскольку карты в основном связаны с операциями на основе клавиш.