为什么编码应该是接口"特别是对于原始数据类型?

时间:2012-02-22 10:13:48

标签: java oop design-patterns interface

我对设计方法有疑问,为什么我们将代码实现到接口。在原始数据类型中非常注意到这一点。就像我没有区分这两者:

Map<Integer, String> mymap = new HashMap<Integer, String>(); 

HashMap<Integer, String> mymap = new HashMap<Integer, String>();

这两者有什么区别吗?我的意思是我们将要使用mymap的每个地方在两种情况下都会保持相同。

如果这个问题似乎毫无用处,我很抱歉,但我真的没有意识到这将会在以后使用mymap的地方产生什么影响。请帮帮忙?

谢谢..

注意 - 我已经在SO上看过this问题,但它没有给出我想要的内容。

6 个答案:

答案 0 :(得分:4)

第二个选项限制您始终使用HashMap,即使有一天TreeMap可能更有用。

在第一个中,您可以更轻松地更改特定实现 - 您只需更改一行代码。如果从方法返回地图,它尤其可见 - 方法返回类型不必更改。

编码到接口也有助于在测试期间模拟对象,但我认为这不是这种情况。

答案 1 :(得分:1)

由于mymap可以使用Map的不同实现在其他地方实例化,因此您不应该依赖它作为使用它的代码中HashMap的实例。

答案 2 :(得分:0)

使用Map mymap可以让您稍后更改实施。例如,如果您在某个时刻需要订购mymap,则只需将初始化更改为LinkedHashMap即可。

答案 3 :(得分:0)

如果你只是在你的类型中使用它(意思是:私有)并自己实例化它,它并没有真正的区别。

如果您的类型的公共接口公开了Map与HashMap,它就开始变得有趣了。

答案 4 :(得分:0)

在您提出的具体实例中,它可能没有什么区别,但是让自己习惯于在声明中始终使用界面是一种好习惯,因为有合理的实例,您需要< / strong>那种灵活性。

答案 5 :(得分:0)

前者允许您更改为:

Map<Integer, String> mymap = new TreeMap<Integer, String>(); 
例如,

,不会破坏所有其余代码。

一个更小的优点是您的IDE可以向您显示接口的方法,而不是(可能更多的)实现方法。