我有一个扩展LinkedHashMap
的类,该类用作缓存。该缓存具有一个属性,该属性定义允许缓存存储的最大大小(以字节为单位)。我对存储的对象大小进行了粗略估计。
我覆盖了put
,以便更新缓存当前存储的总大小。
我还重写了remove
,以从总数中减去已删除的对象的大小。
目前,我正在检查是否需要从缓存中删除陈旧条目,以释放在put
方法中添加新值时释放的空间,但是我想将此功能移至方法。
我遇到的问题是,如果我覆盖的removeEldestEntry
返回removeEldestEntry
,则不会调用我覆盖的true
方法。这导致一个问题,当remove
删除陈旧条目时,当前存储的大小变量未更新。
有谁知道removeEldestEntry
返回removeEldestEntry
时采用什么代码路径删除最旧的条目。我是否可以重写用于删除条目的方法?true
触发LinkedHashMap
删除时,我是否可以进行更新计算。
我知道只要您之后返回false,api就会允许您在removeEldestEntry
方法中进行实际删除,但是我想在执行此操作之前先探究其他选项。我认为这是最后一种情况。
最佳答案
查看source code of LinkedHashMap where removeEldestEntry
is called时,它不调用remove
,而是调用removeNode
-在remove
的默认实现中也被调用。
请注意,这是Fragile Base Class problem的示例,其中您试图依赖基类中的实现细节(即,如果removeEldestEntry
返回true,则调用remove
)实际上不是真的-区别在于它已经不是真实的,而不是将来某个时候变得不真实。
您可能需要考虑在LinkedHashMap
周围实现自己的包装器类,该类将很多行为委托给LHM,但在其中实现了所需的特定逐出逻辑。