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

Java 8包含了一个名为Defender方法的新function,它允许在界面中创build默认的方法实现。

现在首先这是Java中所有精简程序员的巨大转变。 我查看了Brain Goetz给出的一个JavaOne 13演示文稿,他正在讨论Collections库中新的stream()parallelStream()实现。

为了在Collection接口中添加新的方法,他们不能在不破坏以前的版本的情况下添加新的方法。 所以他告诉说,为了配合这个,添加了Default方法的一个新特性。

 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"); } } 

现在我的问题基本上是默认的方法只需要添加新的方法接口而不破坏客户端代码有帮助吗? 或者还有其他一些用途吗?

除了在将来的版本中添加接口方法的可能性之外,还有一个重要的地方就是允许interface保留一个function接口,即使它有多个方法。

一个function接口只有一个非默认的抽象方法,可以通过lambdaexpression式来实现。 一个例子是Predicate接口 ,它只有一个抽象方法( test ),同时提供默认方法来否定Predicate或者将它与另一个Predicate结合起来。 如果没有默认的方法,这些方法必须在另一个实用程序类(如Java之前的Collections类)中提供(因为您不想放弃这种interface的lambda实现的可能性)。

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

不过 ,您也有理由将其用于全新的界面中:

其中一个原因是可以使用接口的其他(非默认)方法轻松实现的方法。 使用default方法可以减less对Foo -interface / AbstractFoo -base-implementation组合的需求(例如,参见AbstractList )。

虽然这不会创build一个全新的领域,但这意味着您可以拥有最终用户友好的界面(有许多有用的方法),同时仍然保持简单的实施。

我们会这样做,因为接口与其实现类紧密耦合。 即不可能在不破坏实现者类的情况下在接口中添加方法。 一旦你在接口中添加一个方法,所有实现的类都必须声明这个新方法的方法体。

从Java 8开始,事情变得越来越难看了。 Lambda新function介绍很酷。 但是,现有的Java库(如java.util包)中不能使用此function。 如果您在界面列表中添加一个单一的方法,它会打破一切。 您需要将其实现添加到实现List接口的每个类中。 想象一下,在现实世界中,有多less自定义类将会改变。

接口出现了一个问题,那就是他们没有对扩展进行开放,这意味着如果需要向接口添加新的方法,就会破坏这些接口的现有实现。 因此,即使不需要该方法,所有实现该接口的类都必须为新添加的方法提供实现。 因此界面不容易发展。

想到的一个例子是Hadoop的Java MapReduce API,它在0.20.0版本中被更改为赞成抽象类接口,因为它们更容易进化。 这意味着,可以将一种新的方法添加到抽象类(带有默认实现),而不会破坏该类的旧实现。

随着Java 8的发布,现在可以在接口中添加默认方法,从而使它们也更容易进化。 通过添加默认方法到一个接口,添加新的方法,甚至一个接口都不会破坏预先存在的代码。

  1. 默认方法使得函数式编程概念成为可能。 对于函数式编程types代码,我们只需要一个抽象方法。
  2. 在接口中添加一个方法也不会使所有实现接口的类成为强制的。 简化编码实践