Java 8中默认或Defender方法的用途
Java8包含了一个名为的新特性,它允许在接口中创建默认方法实现 首先,对于所有Java压缩程序员来说,这是一个巨大的范式转变。我观看了Brian Goetz的JavaOne 13演示,他在演示中讨论了集合库中新的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
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 8Collections
类(因为您不想放弃为这样一个接口实现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的空实现,这是不必要的锅炉板代码。使用默认方法,我们可以提供默认值