2015-10-13 12 views
0

例如,LibGDX框架具有定製的集合類,例如Array<T>ObjectMap<K, V>,它們有助於應用/遊戲性能。是否有可能創建一個字面初始化程序,以便Array可以用例如[1,2,3,4]ObjectMap[key:"value"]進行初始化。是否可以在Groovy中爲自定義類實現集合文字初始值設定項?

我知道訪問運營商[]可以通過實施putAt/getAt方法添加到對象,但沒有看到有關字面初始值設定項的任何內容。

它們被鎖定在語言本身像操作符重寫是在Java中還是有辦法爲自定義類創建列表/映射初始值設定項嗎?

+0

你能給你的意思的例子嗎? –

+0

我認爲OP想從'[x:42]'而不是'LinkedHashMap'獲得一個ObjectMap(我的猜測是,這是不可能的)。 @MrPlow你至少可以用'with'來擺脫一些重複。 – cfrick

+0

作爲ObjectMap的'[x:42]不起作用嗎? –

回答

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 metaClass像這樣:

Map.getMetaClass().toObjectMap = { -> 
    def map = new ObjectMap() 
    delegate.each { key, value -> map.put(key, value) } 
    map 
} 

然後,你可以這樣做:

def map2 = [a:2].toObjectMap() 

或者,只寫一個實用的方法來映射轉換爲ObjectMaps ;-)

+0

我明白了。儘管這樣做的缺點是總會有兩個分配。一個用於臨時LinkedHashMap(它將在離開作用域後立即被標記爲GC),另一個用於ObjectMap。我想這是我必須接受的事情(這不像我會每刻度使用文字地圖)。感謝你的回答。 – MrPlow

+0

易用性總是帶有成本;-) –

+0

延長Tim的答案。如果類提供了列表中每個元素都適合的構造函數(例如Object []/Object ...),那麼像ObjectMap map2 = [1,2,3]'這樣的行就可以工作。這仍然會創建一箇中間LinkedHashMap,但未來版本的Groovy可能會對此進行優化。 – blackdrag

相關問題