例如LibGDX框架有自定义的集合类,如Array<T>
和ObjectMap<K, V>
,这有助于应用程序/游戏性能。是否有可能创建一个文字初始化器,以便Array
可以用[1,2,3,4]
初始化,ObjectMap
可以用[key:"value"]
初始化。
我知道访问操作符[]
可以通过实现putAt
/getAt
方法添加到对象中,但没有看到任何关于文字初始化式的内容。
它们是否像Java中的操作符覆盖一样被锁定在语言本身中,或者是否有一种方法可以为自定义类创建列表/映射初始化器?
一种可能的方法是操作现有的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
另一个选项是在基本的Map
元类中添加一个方法toObjectMap()
,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
然后,你可以这样做:
def map2 = [a:2].toObjectMap()
或者,只编写一个实用程序方法将map转换为ObjectMaps;-)