1

我有一个表示一组值的类,这些值将用作地图中的键。

这个类是不可变的,我想使用静态工厂模式将它作为每组不同值的单例。目标是防止创建相同的对象多次(100 多次)并优化 equals 方法。

我正在寻找缓存和重用此类以前实例的最佳方法。首先想到的是一个简单的哈希图,但有其他选择吗?

4

3 回答 3

4

有两种情况:

  • 如果不同对象的数量很小且固定,则应使用enum
    • 它们在声明的常量之外不可实例化,并且EnumMap针对它进行了优化
  • 否则,您可以按计划缓存不可变实例:
    • 如果值可以通过连续范围内的数字索引,则可以使用数组
      • 这就是Integer例如在给定范围内缓存实例的方式valueOf
    • 否则你可以使用某种Map

根据使用模式,您可以选择仅缓存最后N个实例,而不是到目前为止创建的所有实例。这是re.compile在 Python 的正则表达式模块中使用的方法。如果N足够小(例如 5),那么带有线性搜索的简单数组也可以正常工作。

对于Map基于解决方案,也许一个有用的实现是java.util.LinkedHashMap,如果您@Override使用removeEldestEntry.

也有LRUMap来自Apache Commons Collections的更直接地实施此策略。

也可以看看

相关问题

于 2010-08-24T14:46:17.007 回答
2

你试图做的听起来像是享元模式的一个例子,所以寻找参考可能有助于澄清你的想法。

将它们存储在某种地图中确实是一种常见的实现方式。

于 2010-08-24T14:58:36.210 回答
0

你的对象是什么样的?如果您的对象相当简单,我认为您应该考虑不缓存它们 - 对象创建通常非常快。我认为您应该评估可能很小的性能提升是否值得增加缓存的复杂性和努力。

于 2010-08-24T15:02:08.530 回答