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 ;
} |
- Java中用接口名称声明变量的可能副本?
- 在问新问题之前,你也应该接受一些以前问题的答案。
您应该始终将变量和返回类型声明为尽可能不专门化的类,或者理想情况下声明为接口,这样您就可以随时更改实现。
例如,如果在某个时候您决定使用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以外的其他东西,那么使用这个类的所有代码都需要进行修改以适应这个需求。