【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;}@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php遍历数组的四种方法,PHP遍历数组的常见几种方法

小白发博文&#xff0c;看到某个知识点&#xff0c;就当复习下。$arrarray(football > well,swimming>very well,run>not well);第一种方法&#xff1a;foreach遍历数组&#xff1a;foreach($arr as $key>$val){echo $key.-----.$val.;}第二种方法&#xff1a;…

java调用wadl_Java中的WADL:温和的介绍

java调用wadlWADL&#xff08; Web应用程序描述语言 &#xff09;对REST而言&#xff0c;WSDL对SOAP而言。 这种语言的存在引起了很多争议&#xff08;请参阅&#xff1a; 我们需要WADL吗&#xff1f; 或者 需要 WADL还是不需要WADL &#xff09;。 我可以想到使用WADL的一些合…

Js的 继承

Js 和 Java , C等语言不是很一样 . 其他语言有 类和实例 但是Js就比较特殊 , 所以 类和实例 只能说是大多数面向对象编程的语言的基本概念 . Js比较特殊 , 它不去分类和实例的概念 . 而是通过原型(prototype)来实现面向对象编程 . 下面介绍Js中第一种用于继承的方法 var rob…

php 伪静态 500错误,Apache开启伪静态后报500错误.

出自:http://blog.163.com/lgh_2002/blog/static/44017526201051452939761/检查APACHE日志发现如下信息&#xff1a;Request exceeded the limit of 10 internal redirects due to probable configuration error. Use ‘LimitInternalRecursion’ to increase the limit if nec…

onhashchange

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Document</title>6 </head>7 <body>8 <input type"button" value"随机" id"btn1…

mysql+yes数据类型,怎样修改mysql列的数据类型?

修改字段(列)数据类型修改字段的数据类型就是把字段的数据类型转换成另一种数据类型。在 MySQL 中修改字段数据类型的语法规则如下&#xff1a;ALTER TABLE MODIFY 其中&#xff1a;表名&#xff1a;指要修改数据类型的字段所在表的名称&#xff1b;字段名&#xff1a;指需要修…

Redis分片

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

Openstack入坑指南

什么是云计算 概念 云计算是一种基于互联网的计算方式&#xff0c;通过这种方式&#xff0c;共享的软硬件资源和信息&#xff0c;可以按需求提供给计算机和其他设备。用户不需要了解”云“中的基础设施细节&#xff0c;不必具有相应的专业知识&#xff0c;也无需直接控制。云计…

Akka型演员:探索接收器模式

在上一篇文章中&#xff0c;我们研究了Akka Typed提供的一些基本功能。 在本文和下一篇文章中&#xff0c;我们将更进一步地了解一些其他功能&#xff0c;并通过查看Akka Typed提供的两种不同模式来做到这一点&#xff1a;Receiver和Receptionist模式。 如果您是Akka Typed的新…

读书笔记 - 《乌合之众》

以往的随笔都是胡乱写两句&#xff0c;目的主要是为了督促自己尽快把堆积如山的书籍清理掉&#xff0c;但这次值得花几分钟真的写几句。其实实在都想不起来怎么会买它&#xff0c;这次偶然拿起这本书也是因为它很薄&#xff0c;读大部头读得累了放松一下&#xff0c;没想到居然…

MATLAB如何用循环分割,利用Matlab进行分割提取浮游生物

我试图从扫描图像中提取浮游生物.大纲也不错,但是,现在我不知道如何提取图像,因此可以单独保存每个浮游生物.我尝试使用标签,但是有很多噪音,它标出了每一个规格.我想知道是否有更好的方法来做到这一点.这是我的代码&#xff1a;I imread(plankton_2.jpg);figure, imshow(I), …

saxparser_使用SaxParser和完整代码进行XML解析

saxparserSAX解析器使用回调函数&#xff08;org.xml.sax.helpers.DefaultHandler&#xff09;通知客户端XML文档结构。 您应该扩展DefaultHandler并重写一些方法来实现xml解析。 覆盖的方法是 startDocument&#xff08;&#xff09;和endDocument&#xff08;&#xff09;–…

第一个Python程序

在E:\Python 下新建一个hello.py文件&#xff0c;里面的内容是print(hello world) 进入命令提示窗格&#xff0c;输入E: 点击回车 输入 cd python 点击回车 输入Python hello.py 结果如图 转载于:https://www.cnblogs.com/lgqboke/p/5882049.html

matlab导入txt生成曲面,求助:怎样将txt的数据导入到Matlab中并根据参数画出波形...

导师让我把波形画出来&#xff0c;这下完全不会啊&#xff01;希望各位高手帮帮在下……txt中部分数据如下&#xff1a;ID DDD HH:MM:SS.mmmuuun PARA1 PARA2 CH RISE COUN ENER DURATION AMP A-FRQ RMS ASL PCNTS THR R-FRQ I-FRQ SIG STRNGTH ABS-ENERGY1…

Java多线程:易失性变量,事前关联和内存一致性

什么是volatile变量&#xff1f; volatile是Java中的关键字。 您不能将其用作变量或方法名称。 期。 我们什么时候应该使用它&#xff1f; 哈哈&#xff0c;对不起&#xff0c;没办法。 当我们在多线程环境中与多个线程共享变量时&#xff0c;我们通常使用volatile关键字&…

20145219 《信息安全系统设计基础》第01周学习总结

20145219 《信息安全系统设计基础》第01周学习总结 教材学习内容总结 别出心裁的Linux命令学习法 1、Ubuntu快捷键 CTRLALTT:打开终端&#xff1b;CTRLSHIFTT&#xff1a;新建标签页&#xff1b;ALT数字N&#xff1a;终端中切换到第N个标签页&#xff1b;Tab:终端中命令补全&…

拉盖尔多项式 matlab,类氢原子的定态波函数

&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp预备知识 球坐标系中的定态薛定谔方程&#xff0c;原子单位制本文使用原子单位制&#xff0e;类氢原子(hydrogen-like atom)被定义为原子核有 $Z$ 个质子(核电荷为 $Ze$)有一个核外电子的原子/离子&#xff0…

再论EM算法的收敛性和K-Means的收敛性

标签&#xff08;空格分隔&#xff09;&#xff1a; 机器学习 &#xff08;最近被一波波的笔试面试淹没了&#xff0c;但是在有两次面试时被问到了同一个问题&#xff1a;K-Means算法的收敛性。在网上查阅了很多资料&#xff0c;并没有看到很清晰的解释&#xff0c;所以希望可以…

java xml dom getelementbyid,DOM中常见的元素获取方式

1.getElementById获取元素 返回的是一个元素对象var timer document.getElementById(time);console.dir 打印返回元素对象&#xff0c;更好的查看里面的属性和方法console.dir( timer );2.getElementsByTagName 获取某类标签元素 返回的是 获取过来元素对象的集合 以…

杰尔·地狱

什么是JAR地狱&#xff1f; &#xff08;或者是classpath地狱&#xff1f;还是依赖地狱&#xff1f;&#xff09;在考虑使用Maven或OSGi等现代开发工具时&#xff0c;哪些方面仍然有意义&#xff1f; 有趣的是&#xff0c;似乎没有对这些问题的结构化答案&#xff08;即&#…