【问题标题】:variable declaration: why interface变量声明:为什么是接口
【发布时间】:2011-10-09 11:27:56
【问题描述】:

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

【问题讨论】:

标签: java interface declaration return-type


【解决方案1】:

您应该始终将变量和返回类型声明为尽可能不专业化的类,或者理想情况下作为接口声明,以便您可以随时更改实现。

例如,如果您决定使用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 以外的其他内容,则需要更改使用该类的所有代码以适应这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多