我最近遇到了一组代码,它实例化了本地地图,如下所示:
HashMap<String, Object> theMap = new HashMap<String, Object>();
通常,当我看到使用HashMaps(并自己使用它们)时,局部变量只是Map
(接口),而不是绑定到特定的实现。显然,如果Map
可能被实例化为各种Map
类型(例如接受参数),则需要这样做。但是,如果像上面那样在同一点定义和实例化的东西,是否有一个潜在的理由只使用接口类型,或者它只是样式/约定?
答案 0 :(得分:7)
(我最初误解了基于标题的问题,但我已经包含了类型和变量约定,因为两者都很有趣。)
重要的是它是一张地图:你看到的东西。其余的是一个实现细节。
我建议给它一个语义名称,例如
Map<String, Object> nameToSessionMap = ...
...当你阅读代码时,你会知道键和值是什么。
对于变量的类型 - 再次,我通常使用接口而不是实现,部分原因是它表明我没有使用任何特定于该类型的成员。我不想强调代码中的实现,通常......这意味着当我做关心实现时,我可以做得更明显。
答案 1 :(得分:6)
将对象声明为Map
将允许编译器保护您不要调用特定于HashMap
的方法。这将允许您将来替换另一个Map
实现,而不必担心Map
接口中不存在方法调用。
答案 2 :(得分:1)
一般来说,人们主要使用Map来对实现做出最少量的假设。
不能将Classname用于其他方法,因为只有HashMap添加了clone(),而HashMap已被废弃(有充分理由)。
可能是因为某种原因地图需要Serializable,而普通的Map接口不会扩展它,但是HashMap确实实现了它。
答案 3 :(得分:1)
即使在这种情况下,它也保持通用。编码到接口可确保您使用Map
而不是特定的实现。