是否有可能在Groovy中为自定义类实现集合文字初始化



例如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;-)

相关内容

  • 没有找到相关文章

最新更新