修复LRUCache移除事件监听失效

This commit is contained in:
Looly
2022-10-12 00:11:32 +08:00
parent 09e8d7c6d1
commit c12102e89b
4 changed files with 64 additions and 12 deletions

View File

@@ -1,21 +1,28 @@
package cn.hutool.core.map;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
/**
* 固定大小的{@link LinkedHashMap} 实现<br>
* 注意此类非线程安全,由于{@link #get(Object)}操作会修改链表的顺序结构,因此也不可以使用读写锁。
*
* @author looly
*
* @param <K> 键类型
* @param <V> 值类型
* @author looly
*/
public class FixedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = -629171177321416095L;
/** 容量,超过此容量自动删除末尾元素 */
/**
* 容量,超过此容量自动删除末尾元素
*/
private int capacity;
/**
* 移除监听
*/
private Consumer<Map.Entry<K, V>> removeListener;
/**
* 构造
@@ -45,10 +52,26 @@ public class FixedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
this.capacity = capacity;
}
/**
* 设置自定义移除监听
*
* @param removeListener 移除监听
*/
public void setRemoveListener(final Consumer<Map.Entry<K, V>> removeListener) {
this.removeListener = removeListener;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
//当链表元素大于容量时,移除最老(最久未被使用)的元素
return size() > this.capacity;
if (size() > this.capacity) {
if (null != removeListener) {
// 自定义监听
removeListener.accept(eldest);
}
return true;
}
return false;
}
}