Я хотел бы реализовать кеш, ключи и значения которого являются мягкими ссылками, потому что экземпляры, которые он будет содержать, могут занять много времени для вычисления (особенно значений), и я хотел бы, чтобы записи, содержащие объекты, на которые не ссылались, как ключи или как значения чтобы собрать мусор тогда и только тогда, когда мне не хватит памяти. Если бы я использовал слабые ссылки для значений, они были бы собраны мусором, как только на них не будут ссылаться, а это не то, что я хочу делать.
Сначала я использовал этот пример. Он работает, но создание одного потока для каждого экземпляра кеша меня раздражает, он использует сильные ссылки для ключей и удаление устаревших записей самостоятельно (например, WeakHashMap) в некоторых вызовах методов класса кеша не работает (очевидно), когда я рискую запустить не хватает памяти, когда я им не звоню. Я хотел использовать Guava, но MapMaker больше не позволяет использовать программные клавиши, что логично, поскольку эквивалентность по умолчанию основана на равенстве (==), а не на методе equals (), что означает, что невозможно воссоздать идентичный ключ. Однако я согласен с комментарием Себастьяна-Лорбера:
Я думаю, что программные клавиши имели бы смысл, если бы Guava переопределял метод equals в SoftReference. Я видел, что Guava использует «механизм эквивалентности», и я думаю, что для мягких ссылок значение defaultEquivalence не должно быть тождественным, а равным, чтобы справиться с таким случаем.
Я тоже посмотрел на MapDB и JCS.
Как я могу изменить приведенный выше пример или использовать Guava для создания кеша на основе мягких ссылок, предпочтительно используя equals () вместо == для определения равенства ключей?