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

Is there any true point to the Java interface?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How are Java interfaces actually used?

我不是从一个偶然的流行词的角度,而是从一个实际的开发人员的角度。

所以举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    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()";
 }
    }

使用接口:

1
2
3
4
5
6
7
8
9
10
 Client {
  Interface intface = new Class1();

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

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

但是仅仅写一封信有什么好处:

1
2
3
4
5
6
7
8
9
10
 Client {
Class1 clas1 = new Class1();

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

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

完全绕过接口。

接口似乎只是为了增加一层代码而增加了一层代码,或者对他们来说是否不仅仅是"你正在访问的类有这些方法"?


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

您的简单示例并不能真正做到公正,但是让我们将您的接口重命名为更有用和更具体的接口,例如,可以获取项目列表并对其排序的Sorter算法。您可以实现几种不同的排序算法,并且您可能希望根据上下文更改所使用的算法(即,对于大型数据集,快速排序更快,但对于小型数据集,BubbleSort更好等等),因此您不希望将客户机代码绑定到一个特定的算法。通过使用多态Sorter类型(作为接口实现),您可以将不同的具体排序器对象传递给客户机,而不需要客户机知道(并且关心)它实际使用的算法。您可以随时引入一个更好的排序算法,或者删除一个效率低下的排序算法,而不需要客户注意任何事情。

没有接口,这样的壮举是不可能的。另一种方法是直接从(可能是重复的)其他地方调用排序方法,或者在整个地方调用开关块,在添加/删除排序算法时,不可避免地会在忘记正确更新所有地方时引入错误…更不用说,每次这样的更改之后,您都需要重新编译所有客户机代码:-(


假设您需要同时具有方法"method1"和"method2"的对象集合。并且您不想通过编程检查集合中的每个实例的类型。一个对象集合,该接口的实现使您不必执行此操作。它称之为多态性,非常有用。


我使用接口主要是为了

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

因为

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

它实际上不是服务和客户机之间的代码层,而是更正式的契约。


(不知道我如何回应而不被视为答案,但是…)

哇,这么多答案,这么快,相当令人印象深刻的论坛——干杯!-D

那么,是否可以合理地说,接口本质上设置了具体类必须满足的"规则"?

例如,如果我有Class1和Class2类,它们都有方法"getList()"。如果不实现接口class1.getList()可以返回字符串列表,class2.getList()可以返回整数。

本质上,接口设置了我的类必须具有getList()方法的规则,并且该方法必须返回list,因此,如果两者都使用方法"public string getlist();"实现接口列表器,我知道Class1和Class2 getlist()都返回类型列表字符串。

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

如果我有六个左右的类,每个类都有六个方法,这些方法都是我想要的,那么这可能会变得更有用。确保满足.getlist返回字符串"rule"类型的列表。


其他人基本上都在讨论你的问题,但总而言之:是的!

Java语言实际上被认为是一种相当小的面向对象语言,从一开始就有接口。有一些概念描述类之间的关系,如果没有接口或一些性能代价高昂的运行时类型标识,这些关系很难或不可能实现。在著名的设计模式书(这本书本身)中引用的所有或几乎所有模式都依赖于接口。


接口定义了该类型的合同,而没有anu实现细节。这允许您在不知道实际实现类的情况下对接口进行编程。

使用您的代码的接口的优点的一个例子可能是:

1
2
3
4
public void useInterface(Interface obj) {
    obj.methodOne();
    obj.methodTwo();
}

并称之为:

1
2
   useInterface(new Class1());
   useInterface(new Class2());

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


如果您有可能需要多个实现,接口是有用的,可能对于另一种技术(不同的数据库)或测试。


考虑下面接收"intfaces"列表的方法,您不必知道是否处理clas1或clas2,只需处理"is"intface的内容。您可以在后面添加clas3实现intface,它将继续工作…

1
2
3
4
5
6
  public void callMethods(List<intface> intfaces){
    for(Interface intface : intfaces) {
      intface.methodOne();
      intface.methodTwo();
    }
  }