【发布时间】:2009-05-21 11:02:40
【问题描述】:
对于...的方法
- 在输入和输出之间存在静态的一对一映射,并且
- 创建输出对象的成本比较高,而且
- 使用相同的输入重复调用该方法
...需要缓存结果值。
在我的代码中,以下结果值缓存模式重复了很多次(Java 中的伪代码,但问题与语言无关):
private static Map<Input, Output> fooResultMap = new HashMap<Input, Output>();
public getFoo(Input input) {
if (fooResultMap.get(input) != null) {
return fooResultMap.get(input);
}
Output output = null;
// Some code to obtain the object since we don't have it in the cache.
fooResultMap.put(input, output);
return output;
}
一直重复这种结构显然违反了 DRY 原则。
理想情况下,我希望将上面的代码简化为:
@CacheResult
public getFoo(Input input) {
Output output = null;
// Some code to obtain the object since we don't have it in the cache.
return output;
}
理论上的 CacheResult 注释将负责我目前正在手动进行的缓存。
此类缓存的总称是“memoization”。
我正在寻找的确切功能的一个很好的例子是Perl core module "Memoize"。
在哪些语言中存在这种类似 Memoize 的缓存解决方案(在语言级别或库级别)?特别是 - 任何主要平台(如 Java 或 .NET)都存在这样的解决方案吗?
【问题讨论】:
-
(请注意,显示的代码会泄漏并且不是线程安全的。)
-
这是在运行一个 web 上下文,你每次都必须从数据库中获取 Foo 的值?
-
@Chris:不,这个问题与上下文无关。
标签: c# java performance language-agnostic caching