2011-07-12 12 views
0

我基本上需要一個HashMap的稍微修改版本,無論何時讀取或寫入值需要轉換。到目前爲止,我已經試過如下:什麼是構建Java Map的正確方法,它是一個HashMap,但轉換輸入和輸出上的值?

public class MyMap implements Map<String, Object> { 

    private HashMap<String, MyType> map; 

    public Object get(Object key) { 
     return map.get(key).getValue(); 
    } 

    public Object put(String key, Object value) { 
     return map.put(key, MyType.wrap(value)).getValue(); 
    } 

    ... all other methods of the Map interface are handled by map 
} 

我希望這是所有我需要做的,但我用這兩種方法掙扎:

Set<Entry<String,Object>> entrySet() 
Collection<Object> values() 

那些我不能就這麼着地圖的值需要逐一轉換。當然,我基本上可以從HashMap中複製實現,並對其進行修改以適應我的需要,但這似乎是一個相當不好的解決方案,而且在我這樣做之前,我想確保我不會錯過更好的解決方案。

有沒有更好的方法?

+0

爲什麼你不能直接停止地圖中的包裝值? –

+1

它認爲這整個模式是相當醜陋 – Bohemian

+0

我不能這樣做的原因是,該getValue()實際上從一些可變的來源檢索值。如果我將直接在地圖中檢索到的值,他們不會再被更新。 –

回答

2

你可以將hashmap封裝在一個類中,並公開該類中要添加或刪除的方法。

喜歡你可以刪除方法這

Class MyHashmap { 

private Map map = new HashMap(); 

//methods for add/remove to wrap and put in HashMap 
public void add(String ,Object) { 
    map.put(key, MyType.wrap(value)).getValue(); 

} 

//方式相同。

+0

但這種方式MyHasmap沒有實現Map接口,我想 –

+0

另一種方式可能是將轉換邏輯移動到您嘗試放置在地圖上的對象類(如果已知)。 – sudmong

1

看看Apache Commons TransformedMap,看看它是否適合您的需求。

+0

看起來與我所需要的相似,但它只轉換添加的新對象,而我也希望在讀取對象時進行轉換... –

0

你在做什麼本身相當醜陋,所以我不會爲一個稍微醜陋的實現擔心死亡。既可以按照你的建議做,也可以讓get/put方法將轉換後的值放入地圖中,然後其他方法只是簡單的包裝。

+0

我不能做第二個建議,請參閱我的問題帖子的評論#3 –

+0

好的,那麼我認爲你回到了複製標準HashMap實現的一般模式的解決方案,但是在相關位置添加了轉換。 –

相關問題