变量声明:为什么接口

man*_*ang 2 java interface declaration return-type

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

private Map<String,String> namespaceMappings = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我们在这里创建一个Map变量而不是HashMap
此外,如果我要使用getNamespaceMappings字段,我应该返回什么类型?

public Map<String,String> getNamespaceMappings() {
    return namespaceMappings;
}
Run Code Online (Sandbox Code Playgroud)

要么

public HashMap<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}
Run Code Online (Sandbox Code Playgroud)

要么

public Map<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}
Run Code Online (Sandbox Code Playgroud)

rid*_*rid 5

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

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

private Map<String,String> namespaceMappings = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)

至:

private Map<String,String> namespaceMappings = new TreeMap<String,String>();
Run Code Online (Sandbox Code Playgroud)

代码中不需要进行其他更改.

你从中获得的最大价值在于你的课程公开.因此,例如,如果你有方法getNamespaceMappings()返回a Map,那么使用该方法的每一段代码都会知道它们将使用a Map.如果在某些时候你决定在内部将此地图表示为a以外的其他内容HashMap,那么你将把它保留在你的课程内部.

如果你让方法返回一个HashMap,那么你将公开实现细节.将来,如果您想使用除a之外的其他内容HashMap,则需要更改使用此类的所有代码以适应此情况.