2016-02-03 2 views
0

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

I override put, так что я обновляю общий размер, хранящийся в кеше.

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

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

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

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

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

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

ответ

2

Глядя на source code of LinkedHashMap where removeEldestEntry is called, это не вызывает remove, но вместо этого вызывает removeNode - которая также называется в реализации по умолчанию remove.

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

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

+0

Спасибо Энди. RemoveNode является окончательным, поэтому я не могу переопределить это. Я думаю, что лучшим решением для меня является либо реализация оболочки, как вы предложили, либо вызов метода remove вручную в removeEldestEntry и возврат false из него, как предлагает API. – Kialandei

Смежные вопросы