我最近在 Java 中进行了一些sax解析。我注意到了名称空间映射的初始化
private Map<String,String> namespaceMappings = new HashMap<String,String>();
我的问题是为什么我们在这里创建一个 Map 变量而不是 HashMap ?
此外,如果我要使用 getNamespaceMappings 字段,我应该返回什么类型?
public Map<String,String> getNamespaceMappings() {
return namespaceMappings;
}
或
public HashMap<String,String> getNamespaceMappings() {
return (HashMap<String,String>) namespaceMappings;
}
或
public Map<String,String> getNamespaceMappings() {
return (HashMap<String,String>) namespaceMappings;
}
答案 0 :(得分:5)
您应该始终将变量和返回类型声明为可能的最不专用的类,或者理想情况下,作为接口,以便您可以随时更改实现。
例如,如果您在某个时候决定使用TreeMap
而不是HashMap
,那么您只需要更改:
private Map<String,String> namespaceMappings = new HashMap<String,String>();
为:
private Map<String,String> namespaceMappings = new TreeMap<String,String>();
代码中无需其他更改。
你获得的最大价值在于你的课程公开。例如,如果方法getNamespaceMappings()
返回Map
,那么使用该方法的每一段代码都会知道它们将使用Map
。如果您在某个时候决定在内部将此地图表示为HashMap
以外的其他内容,那么您将把这个内容保留在您的课程内部。
如果您使方法返回HashMap
,那么您将公开实现细节。将来,如果您想使用HashMap
之外的其他内容,则需要更改使用此类的所有代码以适应此情况。