当前位置: 首页 > 科技观察

默认接口方法和静态接口方法

时间:2023-03-22 01:35:28 科技观察

Java中的默认接口方法java中的默认接口方法定义如下:publicinterfaceNewInterface{voidotherMethod();defaultvoiddoSomething(){System.out.println("dosomething");}}publicclassNewInterfaceImplimplementsNewInterface{@OverridepublicvoidotherMethod(){}}在接口中使用关键字default声明并提供具体实现,无需添加public关键字即可公开调用该方法,甚至可以在其实现类中重写(@覆盖)。通常,在基于抽象的概念设计中,往往会有多种抽象的实现。如果没有多个实现,就没有必要抽象。而且,接口的实现必须实现接口的所有抽象方法。这不是可选行为。如果我们给一个接口增加一个新的方法,它会影响它所有的实现类。很可能有些实现类根本就没有这个功能,不是必须的,但是又不得不实现。接口默认方法是解决这个问题的有效途径。它允许直接在接口中添加一个功能实现,所有的实现类都可以使用这个功能实现而不需要修改这些实现类。通过这种方式,向后兼容性得到了很好的保留。此外,这是扩展功能接口的唯一方法。如果没有默认方法,一旦功能接口需要扩展,就会引发“灾难性”的连锁反应。这样看来,默认的接口方法确实是一个非常好的特性,但是还是有一些问题需要我们注意。既然Java允许类实现多个接口,那么当一个类实现多个定义相同默认方法的接口时会发生什么?我们再定义一个接口,有一个默认的接口方法,方法名也是doSomething:publicinterfaceAnotherInterface{voidanotherMethod();defaultvoiddoSomething(){System.out.println("doanothersomething");}}这时候,如果一个类同时实现NewInterface和AnotherInterface的方法签名造成的冲突,因为方法签名相同,无法判断使用哪个方法,甚至会编译失败。为了解决这种分歧,我们必须明确地提供这些方法的实现。静态接口方法从Java8开始,我们也可以在接口中定义静态方法。由于静态接口方法不属于具体的对象,不属于接口实现类,不能通过实现类调用静态接口方法,只能通过接口调用。利用这个特性,我们可以实现一些固定范式的功能,而且这个功能不会因为接口的多态性而改变,避免了不良后果。@FunctionalInterfacepublicinterfaceCustomizer{voidcustomize(Tt);staticCustomizerwithDefaults(){return(t)->{};}}这个是SpringSecurity自定义配置的关键接口,如果使用默认配置可以直接通过静态方法实现。如果要自定义,可以实现抽象接口,这样统一的范式就可以稳定下来。一般作为函数的辅助方法使用,这个方法不能被重写。两种场景的区别默认接口方法提供了默认的功能实现,不喜欢可以改。静态接口方法也提供了一个默认的函数实现,不好意思,不管你喜不喜欢,子类是不能重写的。