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