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)
您应该始终将变量和返回类型声明为可能的最不专用的类,或者理想情况下,作为接口,以便您可以随时更改实现.
例如,如果在某些时候您决定使用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,则需要更改使用此类的所有代码以适应此情况.