EffectiveJava——复合优先于继承】的更多相关文章

继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是如何使用你写的程序的,一个程序员继承另一个程序员写的类也是同样的危险. 于方法调用不同的是,继承打破的封装性.换句话说,子类依赖于其超类中特定功能的实现细节.超类的实现有可能随着发行版本的不同而变化,如果真的发生了变化,子类可能会遭到破坏,即使它的代码完全没有修改过.因而,子类有必要随着超类的更新而…
为什么复合优先于继承? 1.继承违反了封装原则,打破了封装性 2.继承会不必要的暴露API细节,称为隐患.比如通过直接访问底层使p.getProperty(K,V)的键值对可以不是String类型 3.继承限定了类的性能,它会把它的缺陷传递给子类 1.复合:不必扩展现有的Set类,而是在此类中加一个私有域,它引用现有类的一个实例 2.它的封装特性使得它更加健壮灵活 3.复合允许设计新的API隐藏父类的缺点 在继承中的例子 public class InstrumentedHashSet<E>…
复合优于继承 继承打破了封装性(子类依赖父类中特定功能的实现细节) 合理的使用继承的情况: 在包内使用 父类专门为继承为设计,并且有很好的文档说明,存在is-a关系 只有当子类真正是父类的子类型时,才适合用继承. 对于两个类A和B,只有两者之间存在"is-a"关系,类B才能拓展类A. 继承机制会把父类API中的所有缺陷传播到子类中,而复合允许设计新的API来隐藏这些缺陷. 复合(composition):不扩展现有的类,而是在新的类中增加一个私有域,引用现有类的一个实例. 转发(fow…
这个,不管是什么书都会这样说,因为常常我们并不需要继承,而只是想把类进行一定的扩展,而我们想扩展的属性或方法对应的类都有,这个时候如果两者是is a的关系,这种关系是确实存在的,那么就可以使用继承,不然一般都是建议使用复合. 如果我们队一个类进行继承的时候,我们如果对其内部的逻辑并不十分了解的时候,直接继承的结果就是可能有些方法是类自己内部调用的,而我们在继承这个方法的时候,可能会覆盖某些方法,或者重载某些方法,或者加上了一些自己的逻辑,这样就会吧原来的逻辑和我们自己的逻辑混杂起来,并且如果继承…
继承是实现代码重用的方法之一,但使用不当则会导致诸多问题. 继承会破坏封装性,对一个具体类进行跨包访问级别的继承很危险. 即,子类依赖父类的实现细节. 如果父类的实现细节发生变化,子类则可能遭到破坏. 举个例子,扩展HashSet,记录HashSet实例创建以来一共进行了多少次添加元素的操作. HashSet有两个添加元素的方法——add(E e)和addAll(Collection<? extends E> c). 那就覆盖这两个方法,在添加操作执行前记录次数: public class I…
1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该子类中重写的方法; 因此子类还没有初始化, 所以可能会造成一些问题. 示例代码如下: 父类: public class Father1 { public Father1() { overRide1(); } public void overRide1(){ System.out.println("父…
复合优先于继承,继承是实现代码重用的有力手段,并不是所有情况都适用,使用不当会导致软件变得很脆弱.与方法调用不同的是,继承打破了封装性. 总而言之,组合和继承,都能实现对类的扩展.但是要分具体情况用哪个实现,是Has-a,还是Is-a的关系. 两者区别如下表所示: 组合  继承 has-a关系 is-a关系 运行期决定 编译期决定 不破坏封装,整体和局部松耦合 破坏封装,子类依赖父类 支持扩展,随意增加组合类 只能继承一个父类,必须包含所有方法,增加系统复杂性 动态选择组合类方法 复用父类方法…
JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于Effective Java第16条) public class MyHashSet<E> extends HashSet<E> { private int addCount = 0; public int getAddCount() { return addCount; } @Over…
为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,子类依赖于超类的实现细节,和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于Effective Java第16条) public class MyHashSet<E> extends HashSet<E>…
类与接口是Java语言的核心,设计出更加有用.健壮和灵活的类与接口很重要. 13.使类和成员的可访问性最小化 设计良好的模块会隐藏起所有的实现细节,仅使用API与其他模块进行通信.这个概念称为信息隐藏或封装,是软件设计的基本原则之一.信息隐藏可以是实现系统各模块的解耦,以使这些模块可以独立的开发.测试.优化.信息隐藏还提高了软件的可重用性,降低了构建大型系统的风险. java中实体的可访问性由实体声明的位置以及访问修饰符(private.不写.protected.public)共同决定.尽可能的…