Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8中默认或Defender方法的用途_Java_Java 8_Interface_Default Method - Fatal编程技术网

Java 8中默认或Defender方法的用途

Java 8中默认或Defender方法的用途,java,java-8,interface,default-method,Java,Java 8,Interface,Default Method,Java8包含了一个名为的新特性,它允许在接口中创建默认方法实现 首先,对于所有Java压缩程序员来说,这是一个巨大的范式转变。我观看了Brian Goetz的JavaOne 13演示,他在演示中讨论了集合库中新的stream()和parallelStream()实现 对于在集合界面中添加新方法,他们不可能只添加新方法而不破坏以前的版本。因此,他告诉我们,为了满足这一需求,添加了默认方法的新特性 public interface SimpleInterface { public void d

Java8包含了一个名为的新特性,它允许在接口中创建默认方法实现

首先,对于所有Java压缩程序员来说,这是一个巨大的范式转变。我观看了Brian Goetz的JavaOne 13演示,他在演示中讨论了集合库中新的
stream()
parallelStream()
实现

对于在
集合
界面中添加新方法,他们不可能只添加新方法而不破坏以前的版本。因此,他告诉我们,为了满足这一需求,添加了默认方法的新特性

public interface SimpleInterface {
  public void doSomeWork();
   
  //A default method in the interface created using "default" keyword
  default public void doSomeOtherWork(){
    System.out.println("DoSomeOtherWork implementation in the interface");
  }
}
现在我的问题是,当需要在不破坏客户端代码的情况下向接口添加新方法时,默认方法是否有用?或者它还有其他用途吗?

正如您所说,主要的动机是允许现有接口的演变

但是,您希望在全新的界面中也使用它们的原因如下:

其中一个原因是可以使用接口的其他(非默认)方法轻松实现的方法。为此使用
default
方法可以减少对
Foo
-接口/
AbstractFoo
-基本实现组合的需要(例如,请参见
AbstractList


虽然这并没有创建一个全新的字段,但这意味着您可以拥有最终用户友好的界面(具有许多有用的方法),仍然保持了实现的简单性。

除了可以在未来版本中向界面添加方法之外,重要的一点是,允许
接口
保持功能接口,即使它有多个方法


函数接口只有一个非默认的抽象方法,可以通过lambda表达式实现。一个例子是,它只有一个抽象方法(
test
),同时提供了否定一个
谓词
或将其与另一个
谓词
组合的默认方法。如果没有默认方法,这些方法必须在另一个实用程序类中提供,如pre Java 8
Collections
类(因为您不想放弃为这样一个
接口实现lambda的可能性)。

接口存在问题,无法扩展,这意味着,如果需要向接口添加新方法,它将破坏这些接口的现有实现。因此,实现该接口的所有类都必须为新添加的方法提供实现,即使不需要该方法。因此,接口不容易发展

想到的一个例子是用于Hadoop的JavaMapReduceAPI,它在0.20.0版本中进行了更改,以支持抽象类而不是接口,因为它们更容易发展。这意味着,可以向抽象类添加一个新方法(使用默认实现),而不必打破类的旧实现

随着Java8的发布,现在也可以在接口中添加默认方法,从而使它们更容易发展。在向接口添加默认方法的情况下,即使向接口添加新方法,也不会破坏预先存在的代码

  • 默认方法使函数式编程概念成为可能。对于函数式编程类型代码,我们只需要一个抽象方法
  • 此外,在接口中添加方法不会使实现接口的所有类都必须使用该方法。简化了编码实践
  • 对于在集合接口中添加新方法,它们不能 只是添加了一个新方法,没有破坏以前的版本

    是的,他们本可以做到这一点,但让我们从API设计器的角度考虑,例如,集合库被一些库(如ApacheCommons、guava等)使用,而许多java项目都使用这些库。现在想象一下,只要在集合接口中添加一个新方法,就会打破整个项目链

    现在我的问题是,默认方法是否有用 当需要在不中断客户端的情况下向接口添加新方法时 密码?或者它还有其他用途吗

    对默认方法的动机/需要

    API以兼容的方式发展

    • 引入默认方法的最初目的是使集合库向后兼容。该库被建模为接口的深层层次结构,包括集合、列表、映射和集合等重要成员。需要对它们进行丰富,使lambda真正适用于日常编程
    为了丰富集合库lambda,java架构师可以 对它们进行重构以支持lambda,但这远远不是一个好主意 解决方案,因为它将破坏所有现有的Java部署和 无数扩展集合层次结构的第三方库

    相反,java架构师考虑引入默认方法功能以实现向后兼容性

    默认方法的用例

    • 一个重要的用例是在java中帮助
      功能性思维。带有默认方法的函数接口是纯行为结构。它不能保持状态。这使您的思维与函数式编程保持一致,并允许您利用编程模型提供的功能

    • 可选方法:java中有一些类实现了接口,但保留了空的方法实现,例如,
      迭代器接口
      。它定义了hasNext和next,还定义了remove方法。在Java8之前,remove被忽略,因为用户不想使用该功能。因此,许多实现迭代器接口的类将具有for remove的空实现,这是不必要的锅炉板代码。使用默认方法,我们可以提供默认值