【问题标题】:Is there any true point to the Java interface? [duplicate]Java接口有什么真正意义吗? [复制]
【发布时间】:2011-03-15 04:55:58
【问题描述】:

可能重复:
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();
 }

并完全绕过接口。

接口似乎只是为了增加一层代码而增加了一层代码, 还是他们不仅仅是“这是您正在访问的类所具有的方法”?

【问题讨论】:

标签: java


【解决方案1】:

使用独立类时,您不需要接口。然而,当你有一个类型层次结构时,接口确实是不可或缺的。

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

如果没有接口,这样的壮举是不可能的。另一种方法是直接从(可能重复的)if-else 或 switch 块中调用选择的排序方法,当添加/删除排序算法时忘记正确更新所有位置时,不可避免地会引入错误。 .. 更不用说每次更改后您都需要重新编译所有客户端代码:-(

【讨论】:

  • 一个简单的例子真的很有用!很好的答案!
  • 这对我来说很有意义。但是,必须有人决定将哪些具体分类器对象传递给客户端的逻辑。有人可以举例说明这可能是什么样子吗?您不只是将 if/else 逻辑降低了一个级别吗?如果我有一项服务想要根据返回的数据量来使用气泡还是快速,这将如何工作以及会是什么样子?
【解决方案2】:

假设您想要一个包含“Method1”和“Method2”两种方法的对象集合。 而且您不想以编程方式检查集合中的每个实例的类型。
实现该接口的对象集合使您免于执行此操作。
它称为多态,它非常很有用。

【讨论】:

    【解决方案3】:

    其他人几乎涵盖了您的问题,但总而言之:是的!

    Java 语言实际上被认为是一种相当简单的面向对象语言,并且接口从一开始就存在。有一些描述类之间关系的概念,如果没有接口或一些性能成本高的运行时类型标识,这些关系很难或不可能做到。著名的Design Patterns 书籍(这里是book itself)中引用的所有或几乎所有模式都依赖于接口。

    【讨论】:

    • GoF 书不依赖于像 Java 的 interface 构造这样的显式接口,而是依赖于继承和抽象类。
    • 在 Java 中实现模式时,您别无选择,只能使用接口而不是抽象类,因为您不能从多个类继承。
    【解决方案4】:

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

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

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

    例如,如果我有 Class1 和 Class2,它们都有方法“getList()”。 如果不实现接口 Class1.getList() 可能会返回一个字符串列表,而 Class2.getList() 可能会返回整数。

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

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

    如果我有大约六个类,每个类都有六个我想要的所有方法,这可能会变得更有用 确保满足 .getList 返回 String 'rule' 类型的列表。

    【讨论】:

    • 要在没有答案的情况下做出回应,您可以写评论;)“实现接口而不是实现。”这允许您更改实现,同时确保您的应用程序或依赖于您的应用程序的其他应用程序不会中断。由于您的实现必须遵守接口的约定。
    • 您可以编辑原始问题以添加您的回复或澄清问题。
    【解决方案5】:

    我主要将接口用于

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

    因为

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

    而且它实际上并不是服务与其客户端之间的代码层,而更像是一份正式的合同。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        使用您的代码的接口的优势示例如下:

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

        并将其称为:

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

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

        【讨论】:

          【解决方案8】:

          考虑以下接收“intfaces”列表的方法,您不必知道是处理 clas1 还是 clas2,您只需要处理“is a” intface。您可以稍后添加 clas3 实现 intface,它仍然可以工作...

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-16
            • 1970-01-01
            • 1970-01-01
            • 2010-11-30
            • 2013-08-24
            相关资源
            最近更新 更多