LinkedHashMap的子类作为缓存

时间:2015-01-20 09:20:16

标签: java caching subclass linkedhashmap

在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值中的一些变量。 所以,我需要自定义(但简单)缓存。

2 个答案:

答案 0 :(得分:2)

此检查文本实际上并不能解释真正的危险。

扩展集合类的真正危险是例如省略覆盖所有方法。例如,在扩展.put()具体实现时,您覆盖.putAll()但不覆盖Map;没有什么能保证你扩展的课程会使用.put()作为&#34; .putAll()后端&#34;,所以你应该覆盖它们。

但是,在你的情况下,你没有这样的担忧。

然而,检查是正确的,它更脆弱&#34;延伸而不是代表。实际上,Guava有很多专门用于&#34;集合授权&#34;的课程,默认授权:ForwardingMapForwardingList等等;然后,您只需覆盖此&#34;委托人&#34;。

所需的方法

答案 1 :(得分:1)

我认为这个建议一般可能不错,但对于LinkedHashMap则不然,因为受保护的方法清楚地表明这个类是为子类化而设计的