java中default关键字(二)

xiaoxiao2021-02-28  13

在(一)中,我们讨论了一下default的使用方法,那么现在我们需要考虑一下java1.8为什么要增加default这个关键字。

本文参照Java8揭秘(三)Default 方法

在java8开发过程中,有件事情就显得非常重要,即在不破坏java现有实现架构的情况下能往接口里增加新方法。引入Default方法到Java8,正是为了这个目的:优化接口的同时,避免跟现有实现架构的兼容问题

让我们来看一段java8的代码

public interface Iterable<T> { default void forEach(Consumer<? super T> arg0) { Objects.requireNonNull(arg0); Iterator arg1 = this.iterator(); while (arg1.hasNext()) { Object arg2 = arg1.next(); arg0.accept(arg2); } } Iterator<T> iterator(); default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(this.iterator(), 0); } }

这个接口大家一定不陌生 ,在java1.7中它的实现是这样的

public interface Iterable<T> { /** * Returns an iterator over a set of elements of type T. * * @return an Iterator. */ Iterator<T> iterator(); }1.8和1.7相比,一目了然,增加了两个default方法,这两个 方法没有在java.util.Collection中声明。(如果要使上面代码生效)容易想到的方案是在现有的接口中新增foreach方法,并在JDK中必要的地方实现foreach。然而,一经发布,要想在某个接口中增加方法,而不修改现该接口现有的实现类,这是不可能做到的。

这样,即使我们把Lambda表达式引入到java8中,但是因为不能牺牲向后兼容,而不可以把Lambda表达式和标准集合类库结合使用。

为了解决这一问题 java引用一个新的概念,虚拟扩展方法。通常也称之为defender方法,他目前可以添加到接口中,为声明的方法提供默认的实现。

简单地说,Java接口现在可以有非抽象方法了。Default 方法带来的好处是,往接口新增一个Default 方法,而不破坏现有的实现架构。

尽管如此,Default 方法不适合过多使用,但是对于Java集合API的优化升级,并达到无缝地结合Lambda表达式来说,Default 方法是至关重要的特性。

转载请注明原文地址: https://www.6miu.com/read-2595530.html

最新回复(0)