我有一个扩展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,但在其中实现了所需的特定逐出逻辑。

10-08 14:37