基于自定义事件的Groovy@Memoize过期

基于自定义事件的Groovy@Memoize过期,groovy,memoization,Groovy,Memoization,我使用groovy处理批处理作业,我计划使用groovy的@Memoize注释缓存域对象,但问题是过期,我想在作业完成时使缓存过期。有没有办法告诉groovy让缓存从代码中过期 根据,@Memoized仅具有最大值和保护缓存大小参数 由于封面下的AST将通过Closure::memoize创建memoize机制,因此您可以使用map和memoized闭包来模拟它,这些闭包可以被释放: class Job { def log = [] def repoBase = [

我使用groovy处理批处理作业,我计划使用groovy的@Memoize注释缓存域对象,但问题是过期,我想在作业完成时使缓存过期。有没有办法告诉groovy让缓存从代码中过期

根据,
@Memoized
仅具有最大值和保护缓存大小参数

由于封面下的AST将通过
Closure::memoize
创建memoize机制,因此您可以使用map和memoized闭包来模拟它,这些闭包可以被释放:

class Job {
    def log = []
    def repoBase = [
        sum: { a, b ->
            log << "sum $a and $b"
            a + b
        },
        multiply: { a, b ->
            log << "multiply $a and $b"
        }
    ]

    def repo

    def startJob() {
        repo = repoBase.collectEntries { key, value -> 
            [(key): value.memoize()] 
        } as Expando
    }

    def withJob(Closure c) {
        startJob()
        c.delegate = repo
        c.delegateStrategy = Closure.DELEGATE_FIRST
        c(this)
        repo = null
    }

}

非常肯定答案是不正确的:谢谢,蒂姆,我也有同样的印象,但我想反复检查,所以这里提出的问题,经过几天的等待,我会得出结论,没有办法。我不知道怎样才能使你的评论正确。
j = new Job()

j.withJob {
    multiply 3, 4
    multiply 3, 4
    multiply 8, 8
    sum 9, 9
    sum 1, 2
    sum 9, 9
}

assert j.log == [
    "multiply 3 and 4",
    "multiply 8 and 8",
    "sum 9 and 9",
    "sum 1 and 2"
]