LinkedHashMap removeEldestEntry和Overriding Remove

时间:2016-02-03 16:00:57

标签: java caching linkedhashmap

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

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

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

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

我遇到的问题是,如果我的被覆盖的removeEldestEntry返回true,我的被覆盖的remove方法就不会被调用。这导致了一个问题,即当removeEldestEntry删除陈旧条目时,我的当前存储大小变量不会更新。

有人知道在removeEldestEntry返回true时删除最长条目所采用的代码路径。我是否可以覆盖用于删除条目的方法?

LinkedHashMapremoveEldestEntry上触发删除时,我是否可以进行更新计算。

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

1 个答案:

答案 0 :(得分:3)

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

请注意,这是Fragile Base Class problem的一个示例,其中您尝试依赖基类中的实现细节(即,如果removeEldestEntry返回true,则remove为(实际上并非如此) - 不同之处在于它已经不是真的,而不是在未来的某个时刻变得不真实。

你可能想考虑围绕LinkedHashMap实现你自己的包装类,它将很多行为委托给LHM,但你实现了你想要的特定驱逐逻辑。