代码接口而不是实现?

时间:2010-09-30 16:45:00

标签: interface

我认为编写接口而不是实现更好。在Java中:

List<User> users = new ArrayList<User>();

如果代码只关心它实现users,则无需在整个程序中指定List的运行时类型。

然而,我遇到很多人认为它完全没问题,即使他们没有使用特定于ArrayList的属性:

ArrayList<User> users = new ArrayList<User>();

我试图解释它的冗余并使程序更难改变,但他们似乎并不关心。还有其他原因这很重要吗?或许我的信念被夸大了?

3 个答案:

答案 0 :(得分:2)

就个人而言,我认为这个论点有两个部分。

  1. 如果从类中的方法返回一个对象,它应该返回最通用的对象。在这种情况下,如果您在返回ArrayList<User>List<User>之间做出选择,请返回List<User>,因为这会让消费您的课程的人们的工作变得更轻松。

  2. 如果你在一个方法内部编码并且你不介意对一个具体类型进行硬编码,那就去吧。这不是我要做的,它将使你的代码在未来更加脆弱,但由于没有外部依赖于这个具体类型(因此第一部分),你不会打破任何消耗代码的人。

答案 1 :(得分:2)

可测性是一个原因。如果使用实现实现,则很难模拟出所需的对象并在测试中使用它。您通常最终会扩展实现和覆盖,这很痛苦。

答案 2 :(得分:0)

如果要使用依赖注入,这一点非常重要。它对于hibernate也很重要 - 如果你有一个集合类型,你必须指定一个接口,因为hibernate提供了自己的集合实现。

那就是说,你不需要迂腐 - 有时候并不重要。有时您希望指定具体类型以获取仅在该类型上可用的方法。