Java8新特性系列-默认方法和静态方法

2025-05-29 0 20

Java8新特性系列-默认方法和静态方法

在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被打破了,Java 8允许开发人员在接口中添加新方法,而无需在实现这些接口的类中进行任何更改。

为什么会有默认方法?

主要是为了方便扩展已有接口;如果没有默认方法,假如给Java中的某个接口添加一个新的抽象方法,那么所有实现了该接口的类都得修改,影响将非常大。

举个例子,Sortable 接口以及实现该接口的类SortableNumberCollection和SortableStringCollection。该接口有两种方法:void sort(); 和T peek()。

publicinterfaceSortable<T>{

voidsort();

Tpeek();

}

sort()方法用于对象排序,T peek()用于获取指定元素,另外需要一个比较器类ObjectComparator来对对象进行排序。

publicclassObjectComparatorimplementsComparator<Comparable>{

@Override

publicintcompare(Comparableo1,Comparableo2){

returno1.compareTo(o2);

}

}

SortableStringCollection是一个自定义集合类可以进行排序,并查看字符串指定元素,代码如下:

publicclassSortableStringCollectionimplementsSortable<String>{

privateList<String>items=newArrayList<>();

publicvoidadd(Stringitem){

items.add(item);

}

@Override

publicvoidsort(){

items.sort(newObjectComparator());

}

@Override

publicStringpeek(){

returnitems.get(0);

}

}

同样,SortableNumberCollection是一个自定义集合类,其中包含可以使用接口方法进行排序和查看的数字列表指定元素,代码如下:

publicclassSortableNumberCollectionimplementsSortable<Integer>{

privateList<Integer>items=newArrayList<>();

publicvoidadd(Integeritem){

items.add(item);

}

@Override

publicvoidsort(){

items.sort(newObjectComparator());

}

@Override

publicIntegerpeek(){

returnitems.get(0);

}

}

在Java8之前如果对接口Sortable添加新方法:T sortAndPeek(),那么SortableStringCollection和

SortableNumberCollection都必须实现T sortAndPeek()方法。

Java8之后提供了一种新的实现方式,默认方法 default method,我们可以对Sortable进行如下改造:

publicinterfaceSortable<T>{

voidsort();

Tpeek();

defaultTsortAndPeek(){//New'defaultmethod'addedintheinterface

sort();

returnpeek();

}

}

同时SortableStringCollection和SortableNumberCollection类不需要任何更改。这样可以减少我们对原有代码的改动。同时如果需要,还可以在实现此接口的任何类中重写该方法T sortAndPeek()的默认实现。

在下图中我们看到default Method不通的标识:

Java8新特性系列-默认方法和静态方法

在多继承中使用默认方法问题

如果两个或多个接口具有相同的默认方法签名,并且一个类实现了这两个接口,则将引发编译时错误。例如:

publicinterfaceInterface1{

voidmethodOne(Stringstr);

defaultvoidnewMethod(){

System.out.println("Interface1:Newlyaddedmethod");

}

}

publicinterfaceInterface2{

voidmethodTwo(Stringstr);

defaultvoidnewMethod(){

System.out.println("Interface2:Newlyaddedmethod");

}

}

publicclassInterfaceImplementationimplementsInterface1,Interface2{

@Override

publicvoidmethodOne(Stringstr){

System.out.println("OverriddenmethodOne:"+str);

}

@Override

publicvoidmethodTwo(Stringstr){

System.out.println("OverriddenmethodTwo:"+str);

}

}

此时代码会提示如下异常:

InterfaceImplementationinheritsunrelateddefaultsfornewMethod()fromtypesInterface1andInterface2

要解决此问题,我们将必须重写类InterfaceImplementation中的方法:

publicclassInterfaceImplementationimplementsInterface1,Interface2{

@Override

publicvoidmethodOne(Stringstr){

System.out.println("OverriddenmethodOne:"+str);

}

//newMethodimplementedtoresolvetheconflict.

@Override

publicvoidnewMethod(){

System.out.println("InterfaceImplementation:Newlyaddedmethod");

}

@Override

publicvoidmethodTwo(Stringstr){

System.out.println("OverriddenmethodTwo:"+str);

}

}

我们总结一下:

  • 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。
  • 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
  • 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。

在Java 8中添加静态方法

接口定义的静态方法独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实例,

就像“默认方法”一样,“静态方法”也可以添加到接口中。例如,我们可以添加一个静态方法Direction getDefaultDirection(),该方法将返回默认Direction,例如:

publicinterfaceSortable<T>{

DirectiondefaultDirection=Direction.DESC;

enumDirection{

ASC,

DESC

};

voidsort();

Tpeek();

staticDirectiongetDefaultDirection(){//'staticmethod'addedtotheinterface.

returndefaultDirection;

}

}

在上面的示例中,可以使用类引用来调用静态Direction getDefaultDirection()方法:

Sortable.getDefaultDirection()

默认方法静态方法的一点思考

接口是设计模式中一种开闭原则的体验,而java8赋予了接口新的特性,使得接口使用起来更加的得心应手了,这也有助于我们更加内聚自己的代码结构了。Java源码中也有很多场景使用到了默认方法,例如:Iterator接口,我们在开发中可以多使用一些新的特性从而提高开发效率及增加代码的健壮性。

publicinterfaceIterable<T>{

Iterator<T>iterator();

defaultvoidforEach(Consumer<?superT>action){

Objects.requireNonNull(action);

for(Tt:this){

action.accept(t);

}

}

defaultSpliterator<T>spliterator(){

returnSpliterators.spliteratorUnknownSize(iterator(),0);

}

}

原文地址:https://www.toutiao.com/i6932637837846135300/

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java8新特性系列-默认方法和静态方法 https://www.kuaiidc.com/113054.html

相关文章

发表评论
暂无评论