LinkedHashMap removeEldestEntry 和覆盖删除

LinkedHashMap removeEldestEntry and Overriding Remove

我有一个 class,它扩展了 LinkedHashMap,我将其用作缓存。此缓存有一个 属性,它定义了允许缓存存储的最大大小(以字节为单位)。我粗略估计了我存储的对象的大小。

我重写 put,以便更新缓存当前存储的总大小。

我还覆盖 remove 以从总数中减去我删除的对象的大小。

目前我正在检查是否需要从缓存中删除陈旧的条目以释放 space 在 put 方法中添加新值,但是我想将此功能移动到 removeEldestEntry 方法的实现。

我遇到的问题是,如果我重写的 removeEldestEntry returns true,我重写的 remove 方法似乎没有被调用。这导致了一个问题,即当 removeEldestEntry 删除陈旧的条目时,我当前存储的大小变量没有更新。

有谁知道在 removeEldestEntry returns true 时采用什么代码路径来删除最老的条目。我是否可以覆盖用于删除条目的方法?

LinkedHashMapremoveEldestEntry 上触发删除时,我可以进行更新计算吗?

我知道 api 允许您在 removeEldestEntry 方法中进行实际删除,只要您之后 return false,但是我想在执行此操作之前探索其他选项.我认为这是最后一种情况。

查看 source code of LinkedHashMap where removeEldestEntry is called,它不会调用 remove,而是调用 removeNode - remove 的默认实现中也会调用它。

请注意,这是 Fragile Base Class problem 的一个示例,其中您试图依赖基础 class 中的实现细节(即如果 removeEldestEntry returns true,remove 被调用)实际上不是真的 - 不同之处在于它已经不是真的,而不是在将来的某个时候变得不是真的。

您可能需要考虑围绕 LinkedHashMap 实现自己的包装器 class,它将很多行为委托给 LHM,但您可以在其中实现所需的特定驱逐逻辑。