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。