Java LinkedHashMap RemoveEdestry和重写Remove

Java LinkedHashMap RemoveEdestry和重写Remove,java,caching,linkedhashmap,Java,Caching,Linkedhashmap,我有一个扩展了LinkedHashMap的类,我用它作为缓存。此缓存具有一个属性,该属性定义允许缓存存储的最大大小(以字节为单位)。我对我存储的对象的大小进行粗略估计 我覆盖put,以便更新缓存当前存储的总大小 我还覆盖remove以从总数中减去已移除对象的大小 目前,我正在检查是否需要从缓存中删除过时的条目,以便在put方法中添加新值时释放空间,但是我想将此功能移动到Removeedestentry方法的实现中 我遇到的问题是,如果我的重写removeEldestEntry返回true,那么我

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

我覆盖
put
,以便更新缓存当前存储的总大小

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

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

我遇到的问题是,如果我的重写
removeEldestEntry
返回
true
,那么我的重写
remove
方法似乎不会被调用。这会导致一个问题,即当
removeEldestEntry
删除过时的条目时,我当前存储的大小变量不会更新

removeEldestEntry
返回
true
时,是否有人知道删除最旧条目所采用的代码路径。我是否可以重写用于删除条目的方法

LinkedHashMap
触发
RemoveedStantry
上的删除时,我是否可以进行更新计算

我知道api允许您在
RemoveedeStantry
方法中执行实际的删除操作,只要您在之后返回false,但是我想在执行此操作之前探索其他选项。我将此视为最后一种情况。

查看,它不调用
remove
,而是调用
removeNode
——这在
remove
的默认实现中也被调用

请注意,这是的一个示例,其中您试图依赖基类中的实现细节(即,如果
removeEldestEntry
返回true,则调用
remove
),但实际上不是真的-区别在于它已经不是真的,而不是在将来的某个时候变得不真实

您可能想考虑在<代码> LinkedHashMap < /COD>中实现自己的包装类,它将许多行为委托给LHM,但在其中实现所需的特定驱逐逻辑。

查看,它不调用<代码>删除< /代码>,而是调用

removeNode
——这在
remove
的默认实现中也被调用

请注意,这是的一个示例,其中您试图依赖基类中的实现细节(即,如果
removeEldestEntry
返回true,则调用
remove
),但实际上不是真的-区别在于它已经不是真的,而不是在将来的某个时候变得不真实


您可能想考虑在<代码> LinkedHashMap < /C>中实现您自己的包装类,它将许多行为委托给LHM,但是在其中实现您想要的特定驱逐逻辑。

谢谢安迪。RemoveNode是最终版本,所以我无法覆盖它。我认为对我来说,最好的解决方案是按照你的建议实现一个包装器,或者在RemoveEdestEntry中手动调用我的remove方法,并按照API的建议返回false。谢谢Andy。RemoveNode是最终版本,所以我无法覆盖它。我认为对我来说,最好的解决方案要么是按照您的建议实现一个包装器,要么在RemoveEdestEntry中手动调用我的remove方法,并按照API的建议从中返回false。