Java 8中Default或Defender方法的目的

Nar*_*hai 43 java java-8 default-method

Java 8包含了一个名为Defender方法的新功能,它允许在接口中创建默认方法实现.

首先,对于Java中所有精简程序员来说,这是一个巨大的范式转换.我查看了Brain Goetz给出的JavaOne 13演示文稿,他正在讨论集合库中的新内容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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ger 57

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

功能接口只有一个非默认的抽象方法,可以通过lambda表达式实现.一个例子是Predicate界面仅具有一个抽象方法(test同时提供用于抵消一个默认的方法)Predicate或将其与另一种组合Predicate.如果没有默认方法,这些方法必须在另一个实用程序类中提供,例如Java 8之前的Collections类(因为您不希望放弃lambda实现的可能性interface).

  • 向上!!!除上述之外,如果您按规范编程,默认方法将尽可能节省大量 **抽象** 类。 (2认同)

Joa*_*uer 20

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

但是,您也有理由想要在全新的界面中使用它们:

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

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

  • 这有点像黑客吗?你怎么看? (6认同)
  • 我*做什么*认为hack是通过在其他辅助类中添加方法来"扩展"接口(参见`Collections.*`).这些很容易做到没有语言更改,但被称为与接口方法**和**有很大不同,具体的实现不能改变它们的作用(这导致丑陋的标记接口,如`RandomAccess`,指示使用哪种算法哪个类,即使它们共享一个共同的接口). (5认同)
  • @Katona相反,现在静态`sort`方法总是一样的.使用默认方法,实际的`Collection`s可以使用针对特定数据结构优化的替代算法来覆盖它.如果您喜欢,该方法可能仍会委托给另一个类中的静态方法. (4认同)
  • 我个人有一种"直觉",它有点不完美,但我不能争辩.我认为这只是对这个问题不熟悉.事实上,我也发现它们也以自己的方式优雅. (3认同)
  • 如果您曾经遇到过客户使用的旧JDBC驱动程序而不是JDK版本,那么您过去真的希望使用默认方法,即使他们只是抛出`UnsupportedOperationException`(就像`Iterator.remove`方法现在一样 - 最后) (2认同)