最近更新的文章都是Java的 Android的比较少,阅读量也不多,感觉是看EffectiveJava的人比较少?还是我写得太烂了?- -。 如果你有什么建议或想法可以留言提哈!~ 上一篇13-15条 EffectiveJava这本书写得很不错的,有机会一定要去看看!
第16条 复合优先于继承
在读HeadFirstDesignPattern的时候已经看到太多次了
这里的继承是指
实现继承
(implementation inheritance)也即extends
而不是接口继承
复合(composition)也应该是常听到的组合
继承打破了封装性 子类依赖于超类中特定功能的实现细节 当超类发生改变,子类可能会遭到破坏
比如随着版本的发布,超类需要新增方法,但是这些方法不是所有子类需要的,那么就破坏了子类!
复合,即使用包装类(wrapper class),其实这也就是设计模式中的装饰者模式
另外值得一提的是,复合以及转发并不是委托(delegation)
装饰者模式的优缺点不多说了,可以看设计模式的笔记
继承功能确实强大,但它也存在很多问题,比如违背了封装原则(是不是很矛盾?),对于两个类,它们确实有is-a
的关系时候才使用继承!
所以使用继承的时候要考虑清楚
好的API文档应该描述一个给定的方法做了什么工作,而不是描述它是如何做到的
如标题,恩,我可是连注释都懒得写的人,怎么会写文档。。。
Java提供两种机制用来定义允许多个实现的类型:接口
和抽象类
。
接口和抽象类的区别有很多,其中 最为明显 的区别是: 抽象类可以包含某些方法的实现,而接口不允许,即接口都是抽象方法
而另外还有一个 更重要 的区别是:为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。而Java是单继承的,所以抽象类作为类型定义受到了极大的限制,而接口没有这个限制。
implements
具体的接口即可,非常方便,而如果通过抽象类来实现,则需要在抽象类里新增方法,而这会导致其他继承该抽象类的类也被强制加上额外的方法!Comparable
是一个mixin接口我的理解是:一个类,利用实现多个接口可以达到混合类型的目的,而利用抽象类只能继承一个类,则不能达到混合类型的效果!
EJ比较有难度,如果我有什么错误,或者你有更好的理解欢迎留言指导! 如果你觉得我写得还行,那么欢迎关注~