这个,不管是什么书都会这样说,因为常常我们并不需要继承,而只是想把类进行一定的扩展,而我们想扩展的属性或方法对应的类都有,这个时候如果两者是is a的关系,这种关系是确实存在的,那么就可以使用继承,不然一般都是建议使用复合。

如果我们队一个类进行继承的时候,我们如果对其内部的逻辑并不十分了解的时候,直接继承的结果就是可能有些方法是类自己内部调用的,而我们在继承这个方法的时候,可能会覆盖某些方法,或者重载某些方法,或者加上了一些自己的逻辑,这样就会吧原来的逻辑和我们自己的逻辑混杂起来,并且如果继承的类内部有使用这个类的话,那么就会调用我们自己写的部分逻辑,那么结果就变得不可预料了

这里的建议是使用包装类模式

package cn.xf.cp.ch02.item16;import java.util.Collection;
import java.util.Iterator;
import java.util.Set;public class ForwardingSet<E> implements Set<E>
{/*** 这个类作为转发类,内部通过复合的方式把set作为一个组件*/private final Set<E> s;public ForwardingSet(Set<E> s){this.s = s;}@Overridepublic int size(){return s.size();}@Overridepublic boolean isEmpty(){return s.isEmpty();}@Overridepublic boolean contains(Object o){return s.contains(o);}@Overridepublic Iterator<E> iterator(){return s.iterator();}@Overridepublic Object[] toArray(){return s.toArray();}@Overridepublic <T> T[] toArray(T[] a){return s.toArray(a);}@Overridepublic boolean add(E e){return s.add(e);}@Overridepublic boolean remove(Object o){return s.remove(o);}@Overridepublic boolean containsAll(Collection<?> c){return s.containsAll(c);}@Overridepublic boolean addAll(Collection<? extends E> c){return s.addAll(c);}@Overridepublic boolean retainAll(Collection<?> c){return s.retainAll(c);}@Overridepublic boolean removeAll(Collection<?> c){return s.removeAll(c);}@Overridepublic void clear(){s.clear();}}

这样,我们在每个方法中调用了私有成员的方法,那么私有成员对外部就是不可见的,它里面的方法就不会和外面的方法混杂起来

package cn.xf.cp.ch02.item16;import java.util.Collection;
import java.util.Set;/*** *功能:包装类*时间:下午9:58:36*文件:InstrumentedSet.java *@author xiaof ** @param <E>*/
public class InstrumentedSet<E> extends ForwardingSet<E>
{private int addCount = 0;    //用来统计set添加了多少元素public InstrumentedSet(Set<E> s){super(s);}@Overridepublic boolean add(E e){++addCount;return super.add(e);}@Overridepublic boolean addAll(Collection<? extends E> c){addCount += c.size();return super.addAll(c);}public int getAddCount(){return addCount;}}

转载于:https://www.cnblogs.com/cutter-point/p/5866587.html

【Effective Java】6、使用复合优先于使用继承相关推荐

  1. Effective Java~58. for-each 循环优先于传统的for 循环

    传统的 for循环来遍历一个集合: // Not the best way to iterate over a collection! for (Iterator<Element> i = ...

  2. 第 3 次读 Effective Java,这 58 个技巧最值!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...

  3. 读完《Effective Java》后,总结了 50 条开发技巧

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Dong GuoChao 来源 | https ...

  4. 读完 Effective Java,我整理了 59 条技巧!(含pdf)

    点击⬆️方"逆锋起笔",公众号回复 编程资源领取大佬们推荐的学习资料 上一篇:CTO 写低级 Bug,致公司 70 GB 数据泄露! 作者:Dong GuoChao 链接:http ...

  5. Effective Java(第3版) 90条经验法则

    目录 第2章 创建和销毁对象 第1条:用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑使用构建器 例子 使用 第3条:用私有构造器或者枚举类型强化Singleton属性 例子 使用 第4条 ...

  6. \(^_^)/ Effective java

    读<Effect Java中文版> 译者序 序 前言 第1章引言 1   第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...

  7. 读《Effective java 中文版》(2)

    FROM 竹笋炒肉 http://hedong.3322.org/ 读<Effective java 中文版>(2) 第10条:谨慎地改写clone Cloneable接口的目的是作为对象 ...

  8. 竹笋炒肉转载 -- 读《Effective java 中文版》(2)

    FROM 竹笋炒肉 http://hedong.3322.org/ 读<Effective java 中文版>(11) 第10条:谨慎地改写clone Cloneable接口的目的是作为对 ...

  9. Effective Java 读书笔记----第三章

    第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...

最新文章

  1. 人工神经网络在行人轨迹预测上的应用
  2. 如何检查JavaScript中的数字是否为NaN?
  3. 性能优化-Bitmap内存管理及优化
  4. 最简单的彩灯管理系统
  5. pythonos基础_python基础之模块之os模块
  6. secureCRT中文字符乱码
  7. Oracle数据库版本维护支持结束时间表以及数据库版本发行时间表
  8. linux部署前后端分离项目命令笔记
  9. excel柱状图堆叠图显示总和_Excel堆积柱形图同时显示合计值和构成值的方法介绍...
  10. 使用QT调用FFMPEG库部署到Android设备、完成视频音频应用开发
  11. Java泛型编程思想
  12. lammps案例:堆垛层错能的计算
  13. VIOS挂载ISO文件
  14. Taro 3.x 开发 APP 记录 (持续记录中。。。)
  15. [毕业生的商业软件开发之路]现代商业软件开发概况
  16. android设备如何苹果,手机怎么玩:如何像安卓一样管理iPhone文件?_苹果 iPhone 5_手机生活新闻-中关村在线...
  17. 《底层逻辑》 思维导图
  18. c语言程序设计教学工作总结,C语言教学的工作总结范文
  19. 使用U盘制做CentOS7.6安装盘并安装CentOS7.6系统
  20. Xcode 常用编译选项设置【推荐】

热门文章

  1. 深度学习pytorch--softmax回归(二)
  2. c语言char指针用法,整理C语言中各种类型指针的特性与用法
  3. java annotation应用_Java Annotation高级应用
  4. FFmpeg options
  5. Mysql存储函数实现增删改查_使用存储过程操作数据库(实现增删改查)
  6. C语言面试-指针和引用的使用场景?
  7. C/C 代码规范注释有哪些讲究?
  8. java xxtea加密,base64和Xxtea的加密和解密
  9. 里氏替换原则_代码需要有单一职责,还要开闭,里氏替换又是什么鬼?
  10. android readonly file system,安卓ROOT权限下“Read-only file sytem”解决办法