是否可以在Groovy中为自定义类实现集合文字初始值设定项?

时间:2015-10-13 16:18:21

标签: collections groovy literals

例如,LibGDX框架具有自定义集合类,例如Array<T>ObjectMap<K, V>,可以帮助实现应用/游戏性能。是否可以创建文字初始值设定项,以便Array可以使用[1,2,3,4]进行初始化,ObjectMap使用[key:"value"]进行初始化。

我知道可以通过实现[] / putAt方法将访问运算符getAt添加到对象中,但是没有看到任何关于文字初始值设定项的内容。

它们是否被锁定为语言本身,就像运算符覆盖在Java中一样,或者有没有办法为自定义类创建列表/映射初始值设定项?

1 个答案:

答案 0 :(得分:3)

一种可能的方法是操纵现有的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; - )