为后代设计接口
java8之前,为接口添加一个方法,还得去破坏所有的子类代码才可以,因为你接口添加了方法,子类得去实现这个方法,不实现就会编译不通过,但是在java8之后增加了缺省方法,可以在接口中添加方法了。
比如有接口B,有a,b两个方法
public interface B {
public abstract void a();
public void b();
}
类C实现了接口B,以及其中的两个方法
public class C implements B {
@Override
public void a() {
}
@Override
public void b() {
}
}
java8以后在不改变类C的前提下,想要在接口B中增加一个c方法是可以实现的。
public interface B {
public abstract void a();
public void b();
//接口中default修饰的方法是缺省方法
default void c() {
System.out.println("good");
}
}
但是你在接口中实现了这个方法,子类当中就会有这个方法,对于子类来说是并不之情的,这样子很可能导致在某些情况下会发生错误。
建议
建议尽量避免利用缺省方法在现有接口上添加新的方法,除非有特殊需要,但就算在
那样的情况下也应该慎重考虑:缺省的方法实现是否会破坏现有的接口实现。然而,在创建接口的时候,用缺省方法提供标准的方法实现是非常方便的,它简化了实现接口的任务
还要注意的是,缺省方法不支持从接口中删除方法,也不支持修改现有方法的签名。
对接口进行这些修改肯定会破坏现有的客户端代码。
结论很明显: 尽管缺省方法现在已经是Java 平台的组成部分, 但谨慎设计接口仍然是
至关重要的。虽然缺省方法可以在现有接口上添加方法,但这么做还是存在着很大的风险。就算接口中只有细微的缺陷都可能永远给用户带来不愉快;假如接口有严重的缺陷, 则可能摧毁包含它的API 。