LinkedHashMap removeEldestEntry и Overriding Remove

У меня есть класс, который расширяется LinkedHashMap который я использую в качестве кеша. Этот кеш имеет свойство, которое определяет максимальный размер в байтах, который кешу разрешено хранить. Я использую приблизительную оценку размера объектов, которые я храню.

Я переопределяю put, чтобы я обновил общий размер, который в данный момент хранит кеш.

Я также переопределить remove вычесть размер объекта, который я удалил из общей суммы.

В данный момент я проверяю, нужно ли мне удалять устаревшие записи из кэша, чтобы освободить место при добавлении нового значения в put метод, однако я хотел бы перенести эту функциональность в реализацию removeEldestEntry метод.

Проблема, с которой я столкнулся, заключается в том, что кажется, removeEldestEntry возвращается trueмоя переопределена remove метод не вызывается. Это приводит к проблеме, когда моя текущая сохраненная переменная размера не обновляется, когда removeEldestEntry удаляет устаревшие записи.

Кто-нибудь знает, какой путь кода используется для удаления старшей записи, когда removeEldestEntry возвращается true, Могу ли я переопределить метод, который используется для удаления записей?

Могу ли я сделать мой расчет обновления, когда LinkedHashMap вызывает удаление на removeEldestEntry,

Я знаю, API позволяет вам сделать фактическое удаление в removeEldestEntry Метод до тех пор, пока вы возвращаете ложь впоследствии, однако я хочу изучить другие варианты, прежде чем делать это. Я рассматриваю это как сценарий последнего случая.

1 ответ

Решение

Глядя на исходный код LinkedHashMap, где removeEldestEntry называется, это не вызывает remove, а вместо звонков removeNode - который также вызывается в реализации по умолчанию remove,

Обратите внимание, что это своего рода пример проблемы хрупкого базового класса, когда вы пытаетесь положиться на детали реализации в базовом классе (то есть, если removeEldestEntry возвращает истину, remove называется) это на самом деле не правда - разница в том, что это уже неправда, а не становится неправдой в какой-то момент в будущем.

Вы можете рассмотреть возможность реализации своего собственного класса-обертки вокруг LinkedHashMap который делегирует большую часть поведения LHM, но в котором вы реализуете конкретную логику выселения, которую вы хотите.

Другие вопросы по тегам