在Java中缓存和重用不可变单例对象的最佳方法是什么?

时间:2010-08-24 14:37:20

标签: java caching hashmap reusability static-factory

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

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

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

3 个答案:

答案 0 :(得分:4)

有两种情况:

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

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

对于基于Map的解决方案,也许有用的实施是java.util.LinkedHashMap,如果您@Override removeEldestEntry,则可以强制执行类似LRU的政策。

来自LRUMapApache Commons Collections还可以更直接地实施此政策。

另见

相关问题

答案 1 :(得分:2)

您尝试制作的内容听起来像是Flyweight Pattern的一个示例,因此寻找对此的引用可能有助于澄清您的想法。

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

答案 2 :(得分:0)

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