在java库中LinkedHashMap有一个方法
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
包含说明
如果此映射应删除其最旧条目,则返回true。 ...如果地图代表缓存
,这很有用
因此,LinkedHashMap具有可用于创建缓存的保护方法。
像这样:
public final class LinkedHashMapCache<K, V> extends LinkedHashMap<K, V> {
private final int MAX_LENGTH = 1000;
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > MAX_LENGTH;
}
}
但是我的IDE使用来自检查的消息突出显示了我的代码:
类'LinkedHashMapCache'显式扩展 'java.util.LinkedHashMap'
报告任何条款 扩展java.util.Collection或java.util.Map类型的具体类。 子类集合类型是新手的常见做法 面向对象的开发人员,但比它更脆弱 委托收集电话。
问题:将LinkedHashMap子类化并抑制检查是否是个好主意?或者我需要另一种解决方案?
我真正的removeEldestEntry方法确实比示例中更复杂,我不仅要检查map的大小,还要检查Entity值中的一些变量。 所以,我需要自定义(但简单)缓存。
答案 0 :(得分:2)
此检查文本实际上并不能解释真正的危险。
扩展集合类的真正危险是例如省略覆盖所有方法。例如,在扩展.put()
具体实现时,您覆盖.putAll()
但不覆盖Map
;没有什么能保证你扩展的课程会使用.put()
作为&#34; .putAll()
后端&#34;,所以你应该覆盖它们。
但是,在你的情况下,你没有这样的担忧。
然而,检查是正确的,它更脆弱&#34;延伸而不是代表。实际上,Guava有很多专门用于&#34;集合授权&#34;的课程,默认授权:ForwardingMap
,ForwardingList
等等;然后,您只需覆盖此&#34;委托人&#34;。
答案 1 :(得分:1)
我认为这个建议一般可能不错,但对于LinkedHashMap则不然,因为受保护的方法清楚地表明这个类是为子类化而设计的