这就是我想做的:
class MyObject {
@Lazy volatile String test = {
//initalize with network access
}()
}
def my = new MyObject()
println my.test
//Should clear the property but throws groovy.lang.ReadOnlyPropertyException
my.test = null
//Should invoke a new initialization
println my.test
不幸的是,惰性字段在 Groovy 中是只读字段,清除该属性会导致异常。
知道如何在不重新实现 @Lazy 注释提供的双重检查逻辑的情况下使惰性字段可重新初始化吗?
更新:
考虑到 soft=true (来自第一个答案)让我进行了一些测试:
class MyObject {
@Lazy() volatile String test = {
//initalize with network access
println 'init'
Thread.sleep(1000)
'test'
}()
}
def my = new MyObject()
//my.test = null
10.times { zahl ->
Thread.start {println "$zahl: $my.test"}
}
大约 1 秒后,我的 Groovy 控制台上会出现以下输出:
init
0: test
7: test
6: test
1: test
8: test
4: test
9: test
3: test
5: test
2: test
这是预期的(和想要的)。现在我添加soft=true
,结果发生了巨大变化,需要 10 秒:
init
init
0: test
init
9: test
init
8: test
init
7: test
init
6: test
init
5: test
init
4: test
init
3: test
init
2: test
1: test
也许我做错了测试或者 soft=true 完全破坏了缓存效果。有任何想法吗?