在Java中键入本地集合的约定

时间:2010-08-18 20:31:57

标签: java naming-conventions coding-style

我最近遇到了一组代码,它实例化了本地地图,如下所示:

HashMap<String, Object> theMap = new HashMap<String, Object>();

通常,当我看到使用HashMaps(并自己使用它们)时,局部变量只是Map(接口),而不是绑定到特定的实现。显然,如果Map可能被实例化为各种Map类型(例如接受参数),则需要这样做。但是,如果像上面那样在同一点定义和实例化的东西,是否有一个潜在的理由只使用接口类型,或者它只是样式/约定?

4 个答案:

答案 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而不是特定的实现。