用一个例子来说明:

package com.test.lx;import java.util.Date;public class Period {private final Date start;private final Date end;public Period(Date start, Date end){if(start.compareTo(end)>0)throw new IllegalArgumentException(start+" after "+end);this.start = start;this.end = end;}public Date start(){return start;}public Date end(){return end;}public static void main(String[] args) {Date start = new Date();Date end = new Date();Period p = new Period(start, end);end.setYear(78);//由于Date是可变的,这里修改了时间,显然不对。System.out.println(p.start+" \n"+p.end);}
}

运行结果为:

先要弄清楚,这是怎么产生的。下面我用一张图来解释出现的结果。

解决方法:根据effective java书中

只要将构造函数里面修改

public Period(Date start, Date end){this.start = new Date(start.getTime());this.end = new Date(end.getTime());if(this.start.compareTo(this.end)>0)throw new IllegalArgumentException(start+" after "+end);}

这样就将main函数里的start、end与Period中的start、end分开了。如下图:

虽然替换构造函数就可以成功避免上述攻击,但是改变Period实例仍然有问题,应为它的访问方法提供了其可变内部成员的访问能力:

public static void main(String[] args) {Date start = new Date();Date end = new Date();Period p = new Period(start, end);p.end().setYear(87);System.out.println(p.start+" \n"+p.end);}

为了防御这第二种攻击,只需修改这两种访问方法,使它返回可变内部域的保护性拷贝即可:

public Date start(){return new Date(start.getTime());}public Date end(){return new Date(end.getTime());}

java保护性拷贝(effective java)相关推荐

  1. Java编程思想+Effective Java+Java核心技术+Java核心技术 卷II+Java语言程序设计(中文+英文+源码)

    Java四大名著(中文+英文+源码 ) 传说中的java四大名著,分享出来方便大家学习! 书名如下: Java编程思想 Effective Java(第2版) Java核心技术 卷I(第8版) Jav ...

  2. java nio拷贝文件_Java 7 – NIO文件革命

    java nio拷贝文件 Java 7("项目代币")已于去年7月问世. 此版本中的新增功能很有用,例如,尝试资源-从try块中自动处理可关闭的资源,switch语句中的字符串,用 ...

  3. Effective Java之必要时进行保护性拷贝(三十九)

    我们来看一个不可变对象的攻守问题: public class Period{private final Date startTime;private finale Date endTime;publi ...

  4. Effective Java之保护性编写readObject方法(七十六)

    readObject方法实际上相当于另一个公有的构造器,与其他构造器一样,它也需要进行参数的有效性检查与保护性拷贝.参考:Effective Java之必要时进行保护性拷贝(三十九) 原因很简单,为了 ...

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

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

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

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

  7. Effective Java读书笔记六:方法

    第38条:检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有些限制.比如,索引值必须大于等于0,且不能超过其最大值,对象不能为null等.这样就可以在导致错误的源头将错误捕获,从而避免 ...

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

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

  9. Effective Java读书笔记八:序列化(74-78)

    第74条:谨慎地实现Serializable接口 对象序列化API,它提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象.将一个对象编码成一个字节流,称作将该对象序列化,相反的处理过 ...

  10. Effective java 总结11 - 序列化

    Effective java 总结11 - 序列化 序列化:对象 -> 字节流 反序列化:字节流 -> 对象 第85条 其他方法优先于java序列化 序列化的根本问题在于:攻击面过于庞大, ...

最新文章

  1. 基础贪心算法(HDU2037今年暑假不AC)
  2. SpringBoot开发第一个Web入门级应用(超详细)
  3. linux 命令api,linux命令行下字典,使用有道API
  4. vtk环境搭建(windowsXP/win7,vtk6.0.0+cmake2.8+vs2010)
  5. php htaccess实现缓存,使用.htaccess进行浏览器图片文件缓存,_PHP教程
  6. python 进程和线程
  7. APP界面设计临摹模板 |教你ui kit套件要怎么使用呢?
  8. asp 检查黑名单_黑名单验证的突破
  9. Java基础IO流(知识体系详解)【五】
  10. 网页选项卡应用4-12
  11. 程序员如何保护好自己的发际线
  12. 用mysql生成工资条,超实用的工资表模板,一键生成工资表
  13. LintCode 51: Previous Permutation
  14. Android Studio 文件名颜色代表含义
  15. Python+Appium自动化之swipe()滑动页面
  16. HWDB1.1数据集 | 手写汉字数据集 |.gnt 转换 .png格式图片| 【❤️有效转换❤️】
  17. 微信小程序(5)——如何制作好看的表格
  18. js动态向页面添加元素
  19. dubbo、dubbox坑集合
  20. PHP三网码支付系统源码PC软件带云端源码/含三套前端模板免签支付系统安装教程

热门文章

  1. JavaScript之字符串函数
  2. struts2自己定义拦截器
  3. jquery时间倒计时
  4. Spring.Net学习笔记十(打造简易的依赖注入框架)
  5. 多步骤查询的解决方案
  6. Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数...
  7. 61.Linux/Unix 系统编程手册(下) -- SOCKET: 高级主题
  8. 23.Linux/Unix 系统编程手册(上) -- 定时器与休眠
  9. 31.卷1(套接字联网API)---流
  10. 13.卷2(进程间通信)---Posix共享内存区