Effective Java学习笔记1

组合还是继承

假设我们要统计set的历史元素数。

1. 定义一个类,申明一个静态成员变量作为计数器,尝试重写add和addAll方法,计数器增加。

发现数量统计是预期的2倍,因为addAll里面调用了add,被两次计数。

如果之重写add,假如addAll以后的发布版本中不调用了add了怎么办。如果把addAll全部重写,那么父类的实现被架空。假如为了保证安全,父类在元素加入之前做检查,我们架空的方法就很危险。

2. 如果父类新增了一个方法,签名和你子类中的一个方法一样,但是返回值不一样,傻眼了,编译通不过。

3. 咋整,用组合模式

新建前置类实现set接口,同时定义一个set的成员变量,继承方法实现调用成员变量的方法。

创建工具类 再扩展前置类,实现计数。就是装饰器模式。

这种玩法和委托有所区别,在于包装的东西和自己有没有关系

还有在回调场景下,不适合。


4.适合用组合却用了继承,比如Properties继承了HashTable,Stack继承了Vector。

Properties对象实例p 可以调用父类的getKey()得到一个很粗糙的值,而且Properties设计的时候只支持String,但是p调用父类的put,随便什么都可以放进去,很乱套。

所以只有 在确定A肯定是B的时候,A再去继承B。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,082评论 0 3
  • 《Effective Java》笔记(上) 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造...
    OCNYang阅读 2,647评论 2 17
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,459评论 0 4
  • ch1 10章,78点,每个点都有正反两面的例子。 基于Java 5。 各个点之间相互独立,有部分互相引用。 看英...
    冰红茶盖阅读 158评论 0 0
  • 上个礼拜基本上又是和身体在对抗中度过了,所以也没有做成什么事情,快到三十岁了,身体却越发的比不上少年了,十几年没有...
    陈总阅读 303评论 0 1