关于java:变量声明:为什么接口

variable declaration: why interface

我最近在Java中做了一些SAX解析。我注意到命名空间映射的初始化

1
private Map<String,String> namespaceMappings = new HashMap<String,String>();

我的问题是为什么我们在这里创建一个映射变量而不是哈希映射?< BR>此外,如果我要有getNamespaceMappings字段,我应该返回什么类型?< BR>

1
2
3
public Map<String,String> getNamespaceMappings() {
    return namespaceMappings;
}

1
2
3
public HashMap<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}

1
2
3
public Map<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}


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

例如,如果在某个时候您决定使用TreeMap而不是HashMap,那么您只需要更改:

1
private Map<String,String> namespaceMappings = new HashMap<String,String>();

到:

1
private Map<String,String> namespaceMappings = new TreeMap<String,String>();

代码中不需要其他更改。

不过,你从中得到的最大价值在于你的班级公开了什么。例如,如果方法getNamespaceMappings()返回Map,那么使用该方法的每一段代码都会简单地知道它们将使用Map。如果在某一点上,您决定在内部将此映射表示为除HashMap之外的其他内容,那么您将把它保留在类内部。

如果您让方法返回一个HashMap,那么您将公开实现细节。将来,如果您想使用除HashMap以外的其他东西,那么使用这个类的所有代码都需要进行修改以适应这个需求。