今天来看提示二十一:为后代设计接口。
在java8之前,如果想要为一个接口添加新的方法,那么所有的实现类都要去实现新方法,即破坏了原有的实现。java8 新增的缺省方法,可以为新加的方法提供默认实现,从而不需要在每个实现类都实现新的方法。
Java 类库的默认方法是高质量的通用实现,在大多数情况下,它们工作正常。 但是,并非每一个可能的实现的所有变体,始终都可以编写出一个缺省方法。比如Java8中的SynchronizedCollection如果不自己覆盖实现removeIf,那缺省方法在多线程时不同步就可能会报错或其他数据异常情况。
在有默认方法出现的时候,接口之前存在的实现可能可以通过编译,但是可能在运行时失败。
尽量避免利用缺省方法在现有接口上添加新的方法。
这一章比较简单,主要是其中关于removeIf方法的讨论。默认方法可能并不能使用于所有子类,导致一些子类必须要重写这个方法,否则调用就会产生问题。我的思考还是如果我们能够提前预见到这个默认方法并不适合所有子类,是否还需要提供这个缺省方法,让所有子类都去自己实现,这样会更加繁琐,但是能减少错误发生的概率。或者在进一步,接口中是否需要提供这个方法,干脆就让需要用的子类自己去实现这个方法。比如collection接口中就不要removeIf这个钩子,如果子类是用数组实现的,有优化的空间,可以自己实现这个方法,或者如果没有需求,就不提供这个方法。不过站在工具类的角度,可能还是现在的这种实现更加友好?
网友评论