【Effective Java】6、使用复合优先于使用继承
这个,不管是什么书都会这样说,因为常常我们并不需要继承,而只是想把类进行一定的扩展,而我们想扩展的属性或方法对应的类都有,这个时候如果两者是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;
} @Override
public int size()
{
return s.size();
} @Override
public boolean isEmpty()
{
return s.isEmpty();
} @Override
public boolean contains(Object o)
{
return s.contains(o);
} @Override
public Iterator<E> iterator()
{
return s.iterator();
} @Override
public Object[] toArray()
{
return s.toArray();
} @Override
public <T> T[] toArray(T[] a)
{
return s.toArray(a);
} @Override
public boolean add(E e)
{
return s.add(e);
} @Override
public boolean remove(Object o)
{
return s.remove(o);
} @Override
public boolean containsAll(Collection<?> c)
{
return s.containsAll(c);
} @Override
public boolean addAll(Collection<? extends E> c)
{
return s.addAll(c);
} @Override
public boolean retainAll(Collection<?> c)
{
return s.retainAll(c);
} @Override
public boolean removeAll(Collection<?> c)
{
return s.removeAll(c);
} @Override
public 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);
} @Override
public boolean add(E e)
{
++addCount;
return super.add(e);
} @Override
public boolean addAll(Collection<? extends E> c)
{
addCount += c.size();
return super.addAll(c);
} public int getAddCount()
{
return addCount;
} }
【Effective Java】6、使用复合优先于使用继承的更多相关文章
- Effective Java 第三版——18. 组合优于继承
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
- Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
- 【Effective Java】8、优先考虑类型安全的异构容器
		有的时候我们一个容器只有一个类型或几个类型并不能满足我们的要求,比如set中存放的元素类型都是同一种,map也就指定的两种 这里我们可以将键进行参数化,而不是将容器参数化,也就是我们可以给容器传一个键 ... 
- 【Effective Java】7、优先考虑泛型方法
		package cn.xf.cp.ch02.item27; import java.util.HashSet; import java.util.Set; public class Union { / ... 
- Effective java第17条:要么为继承而设计,并提供文档说明,要么就禁止继承
		不要过度设计. 面向对象编程,从一开始被洗脑难免在上手写代码时都会首先思考有没有公共方法啊,能不能把两个类抽象成一个父类再继承啊等,慎重使用继承,当要使用继承时一定要在文档注释中写明重写这个方法会给其 ... 
- Effective Java 第三版——23. 优先使用类层次而不是标签类
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
- Effective Java 第三版——29. 优先考虑泛型
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
- Effective Java 第三版——30. 优先使用泛型方法
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
- Effective Java 第三版——33. 优先考虑类型安全的异构容器
		Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ... 
随机推荐
- WPF入门教程系列十二——依赖属性(二)
			二. 依赖属性的优先级 由于WPF 允许我们可以在多个地方设置依赖属性的值,所以我们就必须要用一个标准来保证值的优先级别.比如下面的例子中,我们在三个地方设置了按钮的背景颜色,那么哪一个设置才会是最终 ... 
- Java并发包中CountDownLatch的工作原理、使用示例
			1. CountDownLatch的介绍 CountDownLatch是一个同步工具,它主要用线程执行之间的协作.CountDownLatch 的作用和 Thread.join() 方法类似,让一些线 ... 
- 【原创】C#玩高频数字彩快3的一点体会
			购彩风险非常高,本人纯属很久以前对数字高频彩的一点研究.目前已经远离数字彩,重点研究足球篮球比赛资料库和赛果预测. 这是一篇在草稿箱保存了1年多的文章,一直没发现,顺便修改修改分享给大家.以后会有更多 ... 
- maven -- 学习笔记(三)之搭建nexus私服
			下载和安装nexus (1)官网链接http://www.sonatype.org/nexus/archived/ (直接点击下载链接,发现下载不了,FQ+迅雷就可以下载) (2)解压到指定文件夹,然 ... 
- tomcat 容器生命周期lifecycle
			1.复习java的事件机制 java事件机制包括三个部分:事件.事件监听器.事件源. 事件:一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息. 事件监听器:实 ... 
- [转载]TFS安装配置教程
			最近公司新开发一个项目要用微软的TFS2013进行项目的源代码管理,以前只是用过SVN,从来没有用过TFS,所以在网上百度.谷歌了好一阵子来查看怎么安装和配置,还好花了一天时间总算是初步的搞定了,下面 ... 
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
			前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ... 
- Windows Azure HandBook (7) 基于Azure Web App的企业官网改造
			<Windows Azure Platform 系列文章目录> 1.用户场景: C公司是全球大型跨国连锁餐厅,在世界上大约拥有3万间分店.其IT系统主要部署其海外数据中心,或者租用其他ID ... 
- JS&CSS文件请求合并及压缩处理研究(四)
			本篇将会尝试对之前的代码进行相关的单元测试,验证路径合并规则的覆盖率及正确性. 熟悉 ASP.NET MVC 开发的朋友应该知道,微软在MVC框架下集成了一款名为 Microsoft.VisualSt ... 
- finetuning caffe
			还没解决,以下是解释fine-tune 比如说,先设计出一个CNN结构.然后用一个大的数据集A,训练该CNN网络,得到网络a.可是在数据集B上,a网络预测效果并不理想(可能的原因是数据集A和B存在一些 ... 
