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