在我最近的工作中的一个大型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实用性的示例?
答案 0 :(得分:6)
类似乎现在的方式相对无聊;但是:
它允许他们将HashMap<String, Object>
称为MapHelper
,它更短,并保证一致性。另请参阅'Is there a Java equivalent or methodology for the typedef keyword in C++?'。
as_dict
是一种执行强制转换的实用工具方法。他们似乎对Map包含的内容有远见。这个比使用内联强制更安全,因为强制转换只在一个地方定义。误差较小。
它允许他们以后添加其他功能,而无需更新整个代码库。
将HashMap
扩展为顶级类会使泛型类型参数具体化,也就是说,它们在运行时通过反射可用。请参阅this blog post by Neal Gafter更详细地解释此功能。
所以实际上有很多但很合理的理由。
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
会将通用类型属性限制为String
和Object
最后想象一下,你想检查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>