在业务发展过程中,发现某个功能是所有子类都需要的,那么我们该怎么办?给接口增加抽象方法吗?如果直接在接口增加抽象方法,那么所有已经写好的具体实现类就会报编译错误。因为具体类必须实现接口的全部抽象方法。这样就给代码的扩展带来很大的麻烦。如果可以只在接口增加需要的方法,而所有的实现子类就可以直接拿来使用就方便许多了。这就是运行接口添加默认方法的原因。
public interface CRMSystem {
Client add(Client newGuy);
Event add(Event e, Client guy);
Event[] todayEvents();
// 默认方法,用来升级接口
public default void myMethodDefault() {
...
}
}
那么为什么要在接口增加静态方法和私有方法呢?
public static 返回值类型 方法名(参数列表) {方法体} // 静态方法,不可以是protected,默认是public
private 返回值类型 方法名(参数列表) {方法体} // 私有的普通方法
private static 返回值类型 方法名(参数列表) {方法体} // 私有的静态方法
接口中的默认方法和静态方法是jdk8的新特性,私有方法是jdk9的新特性。
你对默认方法的理解很对,添加默认方法主要是为了支持接口的演进,使接口进行优化和演进变的平滑。在我看来,站在jdk8的角度上这一新特性最好的实践就是使得java支持了Lambda表达式。
静态方法和默认方法类似,简单说来两者都能够完成声明接口中方法的同时提供实现。但只要你了解静态方法你就会知道静态方法不会被继承。这就是二者最大的不同。而这一点不同正是二者应用范围得以区分开的重要原因。
接口中静态方法的出现还基于设计层次的考量提高接口的内聚性。
简单总结一下这哥俩吧。
接口中的静态方法一般都是给接口自己用的,而默认方法则是为了接口后续的迭代设计,确保之前继承了接口的程序不会随着接口的升级而挂掉。
而私有方法的出现主要是为了提高接口中的代码复用性。如果你的接口中有多个默认方法,而这些默认方法又有很多相同部分,那么你可以使用私有方法来将这部分抽离出来,提高代码复用性。