是否可以在 Groovy 中为自定义 类 实现集合字面值初始值设定项?
Is it possible to implement collection literal initializers for custom classes in Groovy?
例如 LibGDX 框架有定制的集合 类,例如 Array<T>
和 ObjectMap<K, V>
,它们有助于 app/game 性能。是否可以创建一个文字初始化程序,以便可以使用 [1,2,3,4]
和 ObjectMap
以及 [key:"value"]
.
等来初始化 Array
我知道可以通过实现 putAt
/getAt
方法将访问运算符 []
添加到对象中,但还没有看到有关文字初始化程序的任何内容。
它们是否像 Java 中的运算符覆盖一样锁定在语言本身中,或者是否有办法为自定义 类 创建 list/map 初始化程序?
一种可能的方法是操纵现有的 LinkedHashMap.asType()
方法以接受 ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后你可以这样做:
def map = [a:1] as ObjectMap
另一种选择是将方法 toObjectMap()
添加到基础 Map
元类中,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
那么,你可以这样做:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将 Maps 转换为 ObjectMaps ;-)
例如 LibGDX 框架有定制的集合 类,例如 Array<T>
和 ObjectMap<K, V>
,它们有助于 app/game 性能。是否可以创建一个文字初始化程序,以便可以使用 [1,2,3,4]
和 ObjectMap
以及 [key:"value"]
.
Array
我知道可以通过实现 putAt
/getAt
方法将访问运算符 []
添加到对象中,但还没有看到有关文字初始化程序的任何内容。
它们是否像 Java 中的运算符覆盖一样锁定在语言本身中,或者是否有办法为自定义 类 创建 list/map 初始化程序?
一种可能的方法是操纵现有的 LinkedHashMap.asType()
方法以接受 ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后你可以这样做:
def map = [a:1] as ObjectMap
另一种选择是将方法 toObjectMap()
添加到基础 Map
元类中,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
那么,你可以这样做:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将 Maps 转换为 ObjectMaps ;-)