Java接口有什么真正的意义吗?

时间:2010-07-13 08:32:10

标签: java

  

可能重复:
  How are Java interfaces actually used?

我不是从一个学术流行语的角度来谈论,而是从一个实际的开发者的角度来看。

举个例子: -

    Class1 implements Interface 
 public String methodOne() {
  return "This is Class1.methodOne()";
 }

 public String methodTwo() {
  return "This is Class1.methodTwo()";
 }
    }
Class2:

    Class2 implements Interface 
 public String methodOne() {
  return "This is Class2.methodOne()";
 }

 public String methodTwo() {
  return "This is Class2.methodTwo()";
 }
    }

使用界面: -

 Client {
  Interface intface = new Class1();

  intface.methodOne();
  intface.methodTwo();

  Interface intface = new Class2();
  intface.methodOne();
  intface.methodTwo();
}

但是,与写作相比有什么好处: -

 Client {
Class1 clas1 = new Class1();

clas1.methodOne();
clas1.methodTwo();

Class2 clas2 = new Class2();
clas2.methodOne();
clas2.methodTwo();
 }

完全绕过界面。

为了增加一层代码,接口似乎只是一层额外的代码, 或者除了“以下是您正在访问的课程的方法有哪些”之外还有更多内容?

8 个答案:

答案 0 :(得分:19)

使用独立类时,不需要接口。但是,当您拥有类型层次结构时,接口确实是必不可少的。

你的简单例子并没有真正公正,但让我们将你的界面重命名为更有用和具体的东西,例如:一个Sorter算法,可以获取项目列表并对其进行排序。您可以实现几种不同的排序算法,并且您可能希望根据上下文更改所使用的算法(即QuickSort对于大型数据集更快,但BubbleSort更适合小型数据集等)所以你不需要想要将客户端代码绑定到一个特定的算法。通过使用多态Sorter类型(作为接口实现),您可以将不同的具体分类器对象传递给客户端,而无需了解(并关心)它实际使用的算法。您可以随时引入更好的排序算法,或者删除一个效率低下的算法,而不会让客户注意到任何内容。

如果没有接口,这样的壮举是不可能的。替代方案是直接从(可能是重复的)if-else调用排序方法,或者在整个地方切换块,在添加/删除排序算法时忘记更新所有位置时不可避免地会引入错误。 ..更不用说你需要在每次这样的改变后重新编译所有客户端代码: - (

答案 1 :(得分:6)

假设您想要一个具有“Method1”和“Method2”两种方法的对象集合。 并且您不希望以编程方式检查集合中的每个实例的类型 界面实现的对象集合使您无法执行此操作。
它称为多态性,非常有用。

答案 2 :(得分:1)

其他人几乎已经覆盖了你的问题,但总而言之:是的!

Java语言实际上被认为是一种相当小的面向对象语言,并且接口从一开始就存在。有一些概念描述了在没有任何接口或某些性能成本高的运行时类型识别的情况下难以或不可能完成的类之间的关系。着名的Design Patterns书中引用的所有或几乎所有模式(这里是book itself)都依赖于接口。

答案 3 :(得分:1)

(不确定如果不将其视为答案,我会如何回应......)

哇,这么多的答案如此之快,令人印象深刻的论坛 - 干杯! :-D

那么说接口本质上设置具体类必须满足的“规则”是否合理呢?

例如,如果我有班级Class1& Class2,两者都有方法'getList()'。 如果没有实现接口,Class1.getList()可以返回一个字符串列表,而Class2.getList()可以返回整数。

本质上,接口设置了我的类必须具有getList()方法的规则,并且该方法必须返回List, 所以如果两者都使用方法'public String getList();'实现Interface Lister我知道Class1& Class2 getList()返回一个 类型列表字符串。

但具体的Class1可以返回一个部门列表,而Class2是一个雇员列表,但我知道它们都返回一个字符串列表。

这可能会变得更有用,如果我有六个左右的每个类别,有六种方法,我想要的 确保满足.getList返回String'规则'类型的列表。

答案 4 :(得分:1)

我主要使用接口

  • 模拟多重继承
  • 定义服务合同和服务实现
  • 单一方法回调合约

因为

  • 一些依赖注入框架需要接口才能工作
  • 模拟界面比模拟类更容易
  • 许多AOP框架使用接口比使用类
  • 更好

它并不是服务与其客户之间的一层代码,而是一个正式的合同。

答案 5 :(得分:0)

如果您可能需要多个实现,可能需要其他技术(不同的数据库)或进行测试,那么接口非常有用。

答案 6 :(得分:0)

接口定义了类型的契约,没有anu实现细节。这使您可以在不知道实际实现类的情况下对接口进行编程。

使用您的代码的接口的优势示例可能是:

public void useInterface(Interface obj) {
    obj.methodOne();
    obj.methodTwo();
}

并将其称为:

   useInterface(new Class1());
   useInterface(new Class2());

Java集合类大量使用接口,它允许您以后切换列表和映射的实现,而无需使用这些实例更改代码。

答案 7 :(得分:-1)

考虑以下接收'intfaces'列表的方法,你不必知道你是否处理clas1或clas2,你只想处理'是'intface'的东西。您可以稍后添加clas3 implements intface,它将继续工作......

  public void callMethods(List<intface> intfaces){
    for(Interface intface : intfaces) {
      intface.methodOne();
      intface.methodTwo();
    }
  }