我的要求是每次访问MAP中的值时都会获得一个新实例。
MyObject {
def type
}
def myMap = [
"key1" : new MyObject()
]
def obj1 = myMap.get("key1")
def obj2 = myMap.get("key1")
obj1和obj2可以是两个不同的实例吗?如果并行执行/访问它将如何表现?
不知道你的用例是什么,但我想我有你的问题的答案:
def myMap = [
"key1" : new MyObject()
]
首先实例化一个新对象,然后将该对象存储在地图中。因此,每次访问它时,都会获得相同的对象。
要创建您描述的行为,您需要向地图添加动态内容 - 闭包!
def myMap = [
"key2" : {-> new MyObject()}
]
但现在myMap.get("key2")
仍然总是相同 - 一个闭包。但是如果你通过调用myMap.get("key2")()
(或短myMap.key2
)执行它,你每次都会得到一个不同的对象!
不幸的是,这是一个接近,因为你会得到。我希望用一个名为getKey3
的键来做一个技巧 - 我希望Groovy在访问key3
时会称之为“getter”,但事实并非如此。
Groovy中还有其他“技巧”可以帮助您实现目标(如MetaProgramming),但我想如果我们知道您的用例,还有更好的解决方案。