什么';构建一个HashMap但在输入和输出上转换值的Java映射的正确方法是什么?

什么';构建一个HashMap但在输入和输出上转换值的Java映射的正确方法是什么?,java,map,wrapper,Java,Map,Wrapper,我基本上需要一个稍加修改的HashMap版本,每当读写一个值时,它都需要转换。到目前为止,我尝试了以下方法: public class MyMap implements Map<String, Object> { private HashMap<String, MyType> map; public Object get(Object key) { return map.get(key).getValue(); } p

我基本上需要一个稍加修改的
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
}
公共类MyMap实现Map{
私有哈希映射;
公共对象获取(对象密钥){
返回map.get(key.getValue();
}
公共对象put(字符串键、对象值){
返回map.put(key,MyType.wrap(value)).getValue();
}
…Map接口的所有其他方法都由Map处理
}
我希望这就是我所需要做的,但我正在与这两种方法作斗争:

Set<Entry<String,Object>> entrySet()
Collection<Object> values()
Set entrySet()
集合值()
这些我不能仅仅转发到map,因为值需要一个接一个地转换。当然,我基本上可以从HashMap复制实现并修改它以满足我的需要,但这似乎是一个相当丑陋的解决方案,在我这么做之前,我想确保我没有错过一个更好的解决方案


有更好的方法吗?

您可以将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();

}

//您可以使用相同的方法为remove添加方法。

您可以将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();

}


//同样,您可以为remove添加方法。

看看Apache Commons,看看它是否适合您的需要。

看看Apache Commons,看看它是否适合您的需要。

您所做的事情本身非常难看,所以我不必担心一个稍微难看的实现。要么按照你的建议去做,要么让get/put方法将转换后的值放到映射中,然后其他方法只是简单的包装器。

你所做的本身就很难看,所以我不会担心有点难看的实现。要么按照你的建议去做,要么让get/put方法把转换后的值放到映射中,然后其他方法就是简单的包装器。

为什么你不能直接停止映射中的包装值呢?它认为整个模式非常丑陋我不能这么做的原因是,getValue()实际上从某个可变源检索值。如果我将检索到的值直接放在映射中,它们将不再更新。为什么你不能直接停止在映射中包装值?它认为整个模式非常糟糕。我不能这样做的原因是,getValue()实际上从某个可变源检索值。如果我将检索到的值直接放在地图中,它们将不再更新。这看起来类似于我需要的,但它只转换添加的新对象,而我还希望在读取对象时进行转换…这看起来类似于我需要的,但它只转换添加的新对象,虽然我也希望在读取对象时进行转换…我不能做第二个建议,请参阅我的问题postOK的注释#3,然后我认为您回到了复制标准HashMap实现的一般模式的解决方案,但在相关位置添加转换。我不能做第二个建议,请参阅我的问题postOK的注释3,然后我认为您回到了复制标准HashMap实现的一般模式,但在相关位置添加转换的解决方案。但这样MyHasmap就不会实现Map接口,我想另一种方法是将转换逻辑移动到你试图放在地图上的对象类,如果知道的话。但是这种方法MyHasmap没有实现地图接口,我想另一种方法是将转换逻辑移动到你试图放在地图上的对象类,如果知道的话。