变量声明:为什么接口

时间:2011-10-09 11:27:56

标签: java interface declaration return-type

我最近在 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;
}

1 个答案:

答案 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之外的其他内容,则需要更改使用此类的所有代码以适应此情况。