哪种语言支持没有样板代码的返回值缓存?

kno*_*orv 5 c# java language-agnostic performance caching

对于......的方法

  • 输入和输出之间存在静态的一对一映射,并且
  • 创建输出对象的成本相对较高,并且
  • 使用相同的输入重复调用该方法

...需要缓存结果值.

在我的代码中,以下结果值缓存模式重复了很多(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;
}
Run Code Online (Sandbox Code Playgroud)

始终重复这种结构明显违反了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;
}
Run Code Online (Sandbox Code Playgroud)

理论上的CacheResult注释会处理我目前正在手工完成的缓存.

这种缓存的一般术语是" memoization ".

我正在寻找的确切功能的一个很好的例子是Perl核心模块"Memoize".

在哪种语言中存在类似Memoize的缓存解决方案(在语言级别或库级别)?特别是 - 对于任何主要平台,如Java或.NET,是否存在这样的解决方案?

Thi*_*ilo 4

不是内置的语言,把 CPAN 模块Memoize在 Perl 领域相当流行,我认为:

   # Compute Fibonacci numbers
    sub fib {
      my $n = shift;
      return $n if $n < 2;
      fib($n-1) + fib($n-2);
    }

    use Memoize;
    memoize('fib');
Run Code Online (Sandbox Code Playgroud)