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, но в котором вы реализуете конкретную логику выселения, которую вы хотите.