`
jobar
  • 浏览: 341666 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

缺省方法(1)-什么是缺省方法?

 
阅读更多
什么是缺省方法?
在"为何要在java中加入Lambda表达式"中使用了一个简单的集合方法forEach来举例,接受一个函数将之作用于每个传入的元素,例如:
   
pointList.forEach(p -> p.move(p.y, p.x));

但java集合框架在15年前设计的时候并没有考虑函数式思想,没有forEach方法,或这种策略要求的任何其他方法。将这些方法单独添加到集合框架中会破坏高度基于接口的集合框架类的一致性,就是这些接口定义了客户端代码依赖的契约(出于同样的原因,增加静态方法到工具集合类中也不是一个可取的解决方案)。所以框架接口需要反映添加到其集合框架中的新功能。但到现在为止将新方法添加到一个接口中,不强制修改现有类是不可能的,因为implements关键字代表由实现类来覆盖接口中所有的抽象方法。如果该接口增加了一个新的抽象方法,实现类也必须改变来实现它。
这就是引入缺省方法的理由(也称为虚拟扩展方法或者defender方法)。他们的目的是使接口得以延伸而不会与现有实现类不兼容。他们这种需求带动了接口的一个显著变化,根据JavaDoc中定义的抽象方法的语义,先前只能声明为抽象方法;而现在则相反,他们也可以以缺省实现的方式来声明具体的方法。例如,Iterator可以假想成有一个像skip这样的方法扩展(跳过单个元素):

   
interface Iterator {
        // existing method declarations
        default void skip() {
            if (hasNext()) next();
        }
    }

假设Iterator以这种方式被扩展:所有实现类现在会自动暴露一个skip方法,客户端代码可以像调用完全相同的抽象接口方法一样调用skip。如果skip被一个实现了Iterator接口的的实例调用而没有为之提供实现,那么在接口中的默认实现就会被调用。另外,因为缺省方法是虚拟的,一个实现Iterator的类可以用更好或更具体的实现来覆盖默认的方法。

“为什么缺省方法需要一个关键字”回答了有关默认方法语法的一个常见问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics