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

虽然这并没有创建一个全新的领域,但这意味着您可以拥有最终用户友好的界面(使用许多有用的方法),同时保持其易于实现。

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

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

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


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

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


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

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


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

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

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


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

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

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

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

  • 默认方法使函数式编程概念成为可能。对于函数式编程类型代码,我们只需要一个抽象方法
  • 还加