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(); } |
完全绕过接口。
接口似乎只是为了增加一层代码而增加了一层代码,或者对他们来说是否不仅仅是"你正在访问的类有这些方法"?
使用独立类时,不需要接口。但是,当您有一个类型层次结构时,接口确实是必不可少的。
您的简单示例并不能真正做到公正,但是让我们将您的接口重命名为更有用和更具体的接口,例如,可以获取项目列表并对其排序的
没有接口,这样的壮举是不可能的。另一种方法是直接从(可能是重复的)其他地方调用排序方法,或者在整个地方调用开关块,在添加/删除排序算法时,不可避免地会在忘记正确更新所有地方时引入错误…更不用说,每次这样的更改之后,您都需要重新编译所有客户机代码:-(
假设您需要同时具有方法"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(); } } |