1,防御性编程。必要时应当考虑采取保护性拷贝的手段来保护内部的私有数据,先来看下面这个例子:

  1. pubic final class Period
  2. {
  3. private final Date start;
  4. private final Date end;
  5. public Period(Date start, Date end)
  6. {
  7. if (start.compareTo(end) > 0)
  8. throw new IllegalArgumentException(start + "after " + end);
  9. this.start = start;
  10. this.end = end;
  11. }
  12. public Date getStart()
  13. {
  14. return start;
  15. }
  16. public Date getEnd()
  17. {
  18. return end;
  19. }
  20. }

这个类存在两个不安全的地方,首先来看第一个***代码

  1. Date start = new Date();
  2. Date end = new Date();
  3. Period p = new Period(start, end);
  4. end.setYear(78);//改变p的内部数据!

这是因为外部和内部引用了同样的数据,为了解决这个问题,应当修改Period的构造函数:

  1. public Period(Date start, Date end)
  2. {
  3. this.start = new Date(start.getTime());
  4. this.end = new Date(end.getTime());
  5. if (start.compareTo(end) > 0)
  6. throw new IllegalArgumentException(start + "after " + end);
  7. }

这样内部的私有数据就与外部对象指向不同,则不会被外部改变

再来看第二个***代码:

  1. Date start = new Date();
  2. Date end = new Date();
  3. Period p = new Period(start, end);
  4. p.getEnd().setYear(78);//改变p的内部数据!

这很显然是由于公有方法暴露了内部私有数据,我们可以只返回内部私有数据的只读版本(即其一份拷贝)

  1. public Date getStart()
  2. {
  3. return (Date)start.clone();
  4. }
  5. public Date getEnd()
  6. {
  7. return (Date)end.clone();
  8. }

2,读到上面这个例子,我想起来了下面这样的代码片段

  1. public class Suit
  2. {
  3. private final String name;
  4. private static int nextOrdinal = 0;
  5. private final int ordinal = nextOrdinal++;
  6. private Suit(String name)
  7. {
  8. this.name = name;
  9. }
  10. public String toString()
  11. {
  12. return name;
  13. }
  14. public int compareTo(Object o)
  15. {
  16. return o
  17. }
  18. public static final Suit CLUBS = new Suit("Clubs");
  19. public static final Suit DIAMONDS = new Suit("diamonds");
  20. public static final Suit HEARTS = new Suit("hearts");
  21. public static final Suit SPADES = new Suit("spades");
  22. private static final Suit[] PRIVATE_VALUES = {CLUBS,DIAMONDS,HEARTS,SPADES};
  23. public static final List VALUES = Collections.unmodifiedList(Arrays.asList(PRIVATE_VALUES));
  24. }

转载于:https://blog.51cto.com/phinecos/368955

《Core Java 2》读书笔记(二)相关推荐

  1. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  2. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  3. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

  4. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  5. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

  6. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  7. 《李元芳履职记》读书笔记二 IT技术管理的沟通与团队建设

    <李元芳履职记>读书笔记二 接一 https://blog.csdn.net/qq_45937199/article/details/103305223 IT技术人员从技术岗走向管理岗,所 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  10. 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各 ...

最新文章

  1. 论文排版中页码的设置方法
  2. Leetcode 剑指 Offer 57 - II. 和为s的连续正数序列 (每日一题 20210809)
  3. flink社区提问没有人回答是怎么回事?
  4. java收获_java学习收获
  5. Raft协议安全性保证
  6. 信息奥赛一本通(1839:【05NOIP提高组】谁拿了最多奖学金)
  7. (转)基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder...
  8. 做IM netty的优势
  9. Win10 打开PLSql,其他软件卡到爆,原因CnPlugin_1.5.4插件的问题
  10. 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
  11. 深度学习网络训练中出现nan的原因分析
  12. 如何解决Mac启动盘已满的问题?MacBooster帮你清理20种垃圾文件!
  13. HTML5小白长成记(5) ---img嵌入图片
  14. ubuntu服务器pdf文件大小,Ubuntu下的PDF阅读器okular安装使用介绍
  15. qq机器人插件之奥运奖牌获得数量
  16. 小程序中打开pdf文件(wx.downloadFile+wx.openDocument)
  17. 线性表长度(线性表实训)
  18. 数学物理方法 05 留数定理
  19. 中国常见空气质量数据标准汇总
  20. 多线程下载王者荣耀壁纸

热门文章

  1. 分布式监控系统Zabbix-3.0.3-完整安装记录(4)-解决zabbix监控图中出现中文乱码问题...
  2. yii 提交表单报400错误,提示 “您提交的数据无法验证”,问题处理。
  3. 查询各个商品分类中各有多少商品的SQL语句
  4. [转]对比Cassandra、 Mongodb、CouchDB、Redis、Riak、 Membase、Neo4j、HBase
  5. Proxmox VE2.2虚拟化安装配置学习笔记(三)
  6. 月薪20+的Android面试都问这些问题(含答案)
  7. 03-03 java 顺序语句结构,选择结构if语句
  8. Webpack入门——使用Webpack打包Angular项目的一个例子
  9. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
  10. 三言两语话敏捷(2) - 持续集成