为什么在实际实现中必须再次键入每个方法时,Java中使用的接口?

时间:2014-01-13 18:43:47

标签: java interface

为什么在实际实现中必须再次键入每个方法时,Java中使用的接口是什么?什么是写出界面使事情变得容易的情况的例子?

3 个答案:

答案 0 :(得分:9)

接口定义合同,而不是实现。这使您可以将自己与接口的实际实现分开 - 只要实现满足合同,您就会感到高兴。

假设您调用一个返回List(这是一个接口)的方法。您可以使用该List,因为您知道它具有List函数,如get()和add()。您不必担心它的列表 kind 。如果List恰好是一个ArrayList,然后方法改为返回一个LinkedList,你根本不需要改变你的代码,因为两者都保证有List函数。

答案 1 :(得分:0)

接口的最大好处之一是您可以在方法参数和返回类型中使用接口。例如,您可以写:

public List join (List list1, List list2)
{
    // some complicated stuff using list1.size() and list2.get() etc
}

答案 2 :(得分:0)

接口有许多优点。

假设以下代码:

public class MyClass {
    public List<String> getNames () {
        List<String> names = new ArrayList<String> ();

        // Populate list of names

        return names;
    }
}

正如Kevin Workman在其出色的答案中所提到的,接口用于定义实现类必须实现的契约。在上面的例子中,getNames方法声明它将返回接口List的实例。但是,合同不会强制您使用特定的List实施;可以使用任何实现List的具体类。在这种情况下,选择了ArrayList

稍后在您的项目中,如果您最终意识到LinkedList将是一个更好的应用程序实现,您可以轻松地将List<String> names = new ArrayList<String> ();更改为List<String> names = new LinkedList<String> ();,而无需更改方法签名,或方法内部的其余现有代码。这是一个很好的做法,它可以防止项目中的许多问题和/或时间损失。

此外,使用接口允许您(或代码的客户端)定义最适合其需求的具体实现。在Map实现的情况下,一些更快,一些更节省空间。

构建单元测试集时,可以理解接口的另一个优点。大多数模拟框架(如果不是全部的话)都使用接口。它允许您构建不需要手动编写每个具体测试实现的测试,并允许测试代码库更小/更简单。

在构建将由其他开发人员使用的API时,使用接口可以使您的API更加简单,并且可以帮助您的客户体验API。这方面的一个例子是Java中提供的DOM XML implementation。如果你看一下API,那里几乎只有接口,没有公开具体的类。在维护此API期间,开发人员可以添加/更改/删除任何具体实现,而不必担心会破坏与现有客户端代码的向后兼容性。

如果他们已经公开了具体的实现,他们就会在API的整个生命周期中一直受到束缚。例如,假设他们提供了一个名为BuggedElement的错误的Element公共实现,并且客户端直接在其代码中使用它。从现在开始,他们将被迫维护此实现,而不是仅删除它并编写新的实现,否则使用此具体实现的现有项目将被迫重新编写引用BuggedElement的代码段。

但是,由于他们选择只在他们的公共API中提供接口,他们可以奢侈地修改现有的实现,或者删除它们并编写新的实现,并且它们永远不会破坏客户端的代码。