为什么扩展hashmap的地图助手会有用?为什么不直接使用hashmap?

时间:2014-11-06 22:02:20

标签: java design-patterns concurrenthashmap

在我最近的工作中的一个大型java代码库中,我看到以下代码:

public class MapHelper extends HashMap<String, Object>{

    private static final long serialVersionUID = 1L;

    public MapHelper() {
        super();
    }

    public MapHelper(MapHelper mh) {
        super(mh);
    }

    public MapHelper as_dict(String key) {
        return (MapHelper)this.get(key);
    }
}

我不确定这有什么用处。您是否有可以阐明上述MapHelper实用性的示例?

3 个答案:

答案 0 :(得分:6)

类似乎现在的方式相对无聊;但是:

  1. 它允许他们将HashMap<String, Object>称为MapHelper,它更短,并保证一致性。另请参阅'Is there a Java equivalent or methodology for the typedef keyword in C++?'

  2. as_dict是一种执行强制转换的实用工具方法。他们似乎对Map包含的内容有远见。这个比使用内联强制更安全,因为强制转换只在一个地方定义。误差较小。

  3. 它允许他们以后添加其他功能,而无需更新整个代码库。

  4. HashMap扩展为顶级类会使泛型类型参数具体化,也就是说,它们在运行时通过反射可用。请参阅this blog post by Neal Gafter更详细地解释此功能。

  5. 所以实际上有很多但很合理的理由。

    Java API中有一些这样的例子,例如:

答案 1 :(得分:4)

这个类的唯一目的似乎是有一个快捷方式

而不是做

Map<String, Map<String,  Map<String,  Map<String, Object>>>> myMap = new HashMap<String, HashMap<String,  HashMap<String,  HashMap<String, Object>>>>();

(这是不好看的)

你可以使用

MapHelper myHelper = new MapHelper(new MapHelper(new MapHelper(new MapHelper())));

因为MapHelper会将通用类型属性限制为StringObject

最后想象一下,你想检查ANY元素是否等于“1”而不知道深度 - 你可以一遍又一遍地调用递归方法 - 或者在MapHelper上实现一次。< / p>

if (myHelper.contains("1"));

答案 2 :(得分:0)

该类的目的是防止您必须在每个想要使用该类型映射的地方硬编码HashMap<String, Object>(它会增加抽象)。通过将其扩展到MapHelper中,可以减少重复次数,并且可以防止您使用菱形运算符使代码混乱。

该类的更好名称将描述底层地图类型的内容(不过于具体):

public class StringMapHelper extends HashMap<String, Object>

如果您这样做,即使您最终更改密钥数据类型,类名仍然是描述性的,并且您不必在代码中的任何位置替换密钥类型:

public class StringMapHelper extends HashMap<FancyString, Object>