为什么映射助手扩展hashmap会有用?为什么不使用hashmap?

问题描述:

在我最近的工作一个大的Java代码的基础上,我看到了下面的代码:为什么映射助手扩展hashmap会有用?为什么不使用hashmap?

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的用处?

+2

检查VCS并询问作者。 – 2014-11-06 22:03:56

+7

你所犯的错误是假设你继承的代码必须是有用的或者存在的理由。 – khelwood 2014-11-06 22:05:19

+0

看起来像它已经完成,以保存客户端从Object投射到MapHelper的HashMap值,但需要更多的上下文才能真正知道,所以我同意@Markus Malkusch – 2014-11-06 22:05:35

确实显得比较轻浮的方式,它是现在;但是:

  1. 它可以让他们参考HashMap<String, Object>MapHelper这是较短的,并保证一致性。另见'Is there a Java equivalent or methodology for the typedef keyword in C++?'

  2. as_dict是执行演员的实用方法。他们似乎对该地图包含的内容有远见。这个比内嵌投射更安全,因为演员只在一个地方定义。错误余量较小。

  3. 它可以让他们稍后添加额外的功能,而无需更新整个代码库。

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

所以实际上有很多小而合法的理由。

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

+0

我也概述了第4点,但它并不是一个好的论点,因为你不需要反射,因为你已经知道它是,因为类是像那样编译的。 – dognose 2014-11-06 22:20:57

+0

@ dognose我同意他们似乎不太可能使用这个功能,但这仍然是可以完成的原因之一。 – Radiodef 2014-11-06 22:24:23

+0

对于来自java api的示例+1。 – dognose 2014-11-07 14:47:22

看起来这个级别的唯一目的是有一个快捷方式

而不是做

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

Finall想象一下,你想在不知道深度的情况下检查ANY元素是否等于“1” - 你可以一次又一次地调用递归方法 - 或者在MapHelper上执行一次

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

类的目的是为了防止您不必硬编码HashMap<String, Object>每一个地方你想使用这种类型的地图(它增加了抽象)。通过将其扩展到MapHelper,您可以减少重复次数,并且防止您不得不与钻石操作员混淆在一起。

为A类更好的名字会是这样描述的基本地图类型是什么(没有太具体的):

public class StringMapHelper extends HashMap<String, Object> 

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

public class StringMapHelper extends HashMap<FancyString, Object>