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
)
虽然这并没有创建一个全新的领域,但这意味着您可以拥有最终用户友好的界面(使用许多有用的方法),同时保持其易于实现。正如您所说,主要动机是允许现有界面的演变
但是,您希望在全新的界面中也使用它们的原因如下:
其中一个原因是可以使用接口的其他(非默认)方法轻松实现的方法。为此使用default
方法可以减少对Foo
-接口/AbstractFoo
-基本实现组合的需要(例如,请参见AbstractList
)
虽然这并没有创建一个全新的字段,但这意味着您可以拥有最终用户友好的界面(具有许多有用的方法),仍然保持了实现的简单性。除了可以在未来版本中向界面添加方法之外,重要的一点是,允许
接口
保持功能接口,即使它有多个方法
函数接口只有一个非默认的抽象方法,可以通过lambda表达式实现。一个例子是,它只有一个抽象方法(
test
),同时提供了否定一个谓词
或将其与另一个谓词
组合的默认方法。如果没有默认方法,这些方法必须在另一个实用程序类中提供,如Java 8之前的Collections
类(因为您不想放弃为这样的接口实现lambda的可能性)。除了在将来的版本中向接口添加方法之外,重要的一点是,允许接口
保持功能接口,即使它有多个方法
函数接口只有一个非默认的抽象方法,可以通过lambda表达式实现。一个例子是,它只有一个抽象方法(test
),同时提供了否定一个谓词
或将其与另一个谓词
组合的默认方法。如果没有默认方法,这些方法必须在另一个实用程序类中提供,如pre Java 8Collections
类(因为您不想放弃为这样一个接口实现lambda的可能性)。接口存在问题,无法扩展,这意味着,如果需要向接口添加新方法,它将破坏这些接口的现有实现。因此,实现该接口的所有类都必须为新添加的方法提供实现,即使不需要该方法。因此,接口不容易发展
想到的一个例子是用于Hadoop的JavaMapReduceAPI,它在0.20.0版本中进行了更改,以支持抽象类而不是接口,因为它们更容易发展。这意味着,可以向抽象类添加一个新方法(使用默认实现),而不必打破类的旧实现
随着Java8的发布,现在也可以在接口中添加默认方法,从而使它们更容易发展。向接口添加默认方法后,即使向接口添加新方法,也不会破坏预先存在的代码。接口存在一个问题,即它们无法扩展,这意味着,如果需要向接口添加新方法,它将破坏这些接口的现有实现。因此,实现该接口的所有类都必须为新添加的方法提供实现,即使不需要该方法。因此,接口不容易发展
想到的一个例子是用于Hadoop的JavaMapReduceAPI,它在0.20.0版本中进行了更改,以支持抽象类而不是接口,因为它们更容易发展。这意味着,可以向抽象类添加一个新方法(使用默认实现),而不必打破类的旧实现
随着Java8的发布,现在也可以在接口中添加默认方法,从而使它们更容易发展。在向接口添加默认方法的情况下,即使向接口添加新方法,也不会破坏预先存在的代码
默认方法使函数式编程概念成为可能。对于函数式编程类型代码,我们只需要一个抽象方法
还加