LinkedHashMap removeEldestEntry 和覆盖删除
LinkedHashMap removeEldestEntry and Overriding Remove
我有一个 class,它扩展了 LinkedHashMap
,我将其用作缓存。此缓存有一个 属性,它定义了允许缓存存储的最大大小(以字节为单位)。我粗略估计了我存储的对象的大小。
我重写 put
,以便更新缓存当前存储的总大小。
我还覆盖 remove
以从总数中减去我删除的对象的大小。
目前我正在检查是否需要从缓存中删除陈旧的条目以释放 space 在 put
方法中添加新值,但是我想将此功能移动到 removeEldestEntry
方法的实现。
我遇到的问题是,如果我重写的 removeEldestEntry
returns true
,我重写的 remove
方法似乎没有被调用。这导致了一个问题,即当 removeEldestEntry
删除陈旧的条目时,我当前存储的大小变量没有更新。
有谁知道在 removeEldestEntry
returns true
时采用什么代码路径来删除最老的条目。我是否可以覆盖用于删除条目的方法?
当 LinkedHashMap
在 removeEldestEntry
上触发删除时,我可以进行更新计算吗?
我知道 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,但您可以在其中实现所需的特定驱逐逻辑。
我有一个 class,它扩展了 LinkedHashMap
,我将其用作缓存。此缓存有一个 属性,它定义了允许缓存存储的最大大小(以字节为单位)。我粗略估计了我存储的对象的大小。
我重写 put
,以便更新缓存当前存储的总大小。
我还覆盖 remove
以从总数中减去我删除的对象的大小。
目前我正在检查是否需要从缓存中删除陈旧的条目以释放 space 在 put
方法中添加新值,但是我想将此功能移动到 removeEldestEntry
方法的实现。
我遇到的问题是,如果我重写的 removeEldestEntry
returns true
,我重写的 remove
方法似乎没有被调用。这导致了一个问题,即当 removeEldestEntry
删除陈旧的条目时,我当前存储的大小变量没有更新。
有谁知道在 removeEldestEntry
returns true
时采用什么代码路径来删除最老的条目。我是否可以覆盖用于删除条目的方法?
当 LinkedHashMap
在 removeEldestEntry
上触发删除时,我可以进行更新计算吗?
我知道 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,但您可以在其中实现所需的特定驱逐逻辑。