为什么映射助手扩展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的用处?
类确实显得比较轻浮的方式,它是现在;但是:
它可以让他们参考
HashMap<String, Object>
为MapHelper
这是较短的,并保证一致性。另见'Is there a Java equivalent or methodology for the typedef keyword in C++?'。as_dict
是执行演员的实用方法。他们似乎对该地图包含的内容有远见。这个是比内嵌投射更安全,因为演员只在一个地方定义。错误余量较小。它可以让他们稍后添加额外的功能,而无需更新整个代码库。
作为顶级类扩展
HashMap
使泛型类型参数具有通用性,也就是说,它们在运行时通过反射可用。请参阅this blog post by Neal Gafter更详细地解释此功能。
所以实际上有很多小而合法的理由。
有一些像这样的例子在Java API中,如:
看起来这个级别的唯一目的是有一个快捷方式。
而不是做
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
将正好限制了泛型类型的属性是String
和Object
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>
检查VCS并询问作者。 – 2014-11-06 22:03:56
你所犯的错误是假设你继承的代码必须是有用的或者存在的理由。 – khelwood 2014-11-06 22:05:19
看起来像它已经完成,以保存客户端从Object投射到MapHelper的HashMap值,但需要更多的上下文才能真正知道,所以我同意@Markus Malkusch – 2014-11-06 22:05:35