美文网首页
Effective Java 第16条: 复合优先于继承

Effective Java 第16条: 复合优先于继承

作者: linyk3 | 来源:发表于2020-01-22 17:27 被阅读0次

继承(inheritance) 是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具.

在包的内部使用继承是非常安全的.然而,对于普通的具体类进行跨越包边界的继承,则是非常危险的.

与方法调用不同的是,继承打破了封装性.

  • 子类依赖于其超类中特定功能的实现细节.
  • 超类在后续的版本中可以获得新的方法.

避免上述问题: 不用扩展现有的类,而是在新的类中新增一个私有域,它引用现有类的一个实例. 这种设计被称为"复合"(composition)
这样得到的类会非常稳固,它不依赖于现有类的实现细节,即使现有的类添加了新的方法,也不会影响新的类.

只有当子类真正是超类的子类型时, 才适合继承.
也就是对于两个类A和B, 只有当两者之间确实存在"is-a"关系的时候,类B才应该扩展A.

简而言之, 继承的功能非常强大,但是也存在诸多问题,因为它违背了封装原则.只有当子类和超类之间确实存在子类型关系时,使用继承才是恰当的. 即便如此, 如果子类和超类处在不同的包中, 并且超类并不是为了继承而设计的, 那么继承将会导致脆弱性. 为了避免这种脆弱性, 可以用复合和转发机制来代替继承,尤其是当存在适当的接口可以实现包装类的时候. 包装类不仅比子类更加健壮, 而且功能也更加强大.

相关文章

  • 设计模式- 合成/组合原则

    《Effective Java》 复合优先于继承 与方法调用不同的是,继承打破了封装性。 上面的问题都来源于对方法...

  • Effective Java 第16条: 复合优先于继承

    继承(inheritance) 是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具. 在包的内部使用继...

  • 复合优先于继承

    继承 是实现代码重用的有力手段,但是它并非永远是完成这项工作的最佳工具。在包的内部使用继承是非常安全的,对于专门为...

  • 组合VS继承

    在Effective Java中明确有提到一种思想就是组合优先于继承。实际中我们可以这样理解,组合是把代码摊开,而...

  • 第16条:复合优先于继承

    继承是实现代码重用的有力手段,但并非总是最好的选择。因为对于普通的具体类进行跨超包边界的继承则是非常危险的,...

  • 《Effective java 中文版》(第2版)分享下载

    书籍信息 书名:《Effective java 中文版》(第2版) 原作名: Effective Java Sec...

  • 组合优于继承

    《Effective Java 中文版第2版》书中第16条中说到: 继承是实现代码复用的有力手段,但它并非永远是完...

  • 提示十八

    今天来看提示十八:复合优先于继承。 书中认为继承打破了封装,这是继承最大的危害,书中举了这样一个例子: 这段代码看...

  • Java继承和复合

    《Effective Java》读书笔记 继承可能导致的问题 首先,大部分情况下,包的内部继承是安全的,因为子类和...

  • 复合优于继承

    第16条:复合优于继承 前言 本条内容的继承不包括接口继承。 1.什么事复合 复合就是在你的类中添加一个私有域,引...

网友评论

      本文标题:Effective Java 第16条: 复合优先于继承

      本文链接:https://www.haomeiwen.com/subject/dafpzctx.html