假设类的客户端会尽其所能来破坏这个类的约束条件,因此你必须保护性的设计程序。
demo:
这个类看上去没有什么问题,时间是不可改变的。然而Date类本身是可变的。
为了保护Period实例的内部信息避免受到修改,导致问题,对于构造器的每个可变参数进行保护性拷贝(defensive copy)是必要的:
保护性拷贝是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是原始对象。
对于参数类型可以被不可信任方子类化的参数,请不要使用clone方法进行保护性拷贝。
通过改变Period:
为了防止二次攻击,可以让end()返回拷贝对象。
但是这样让人写起来很浮躁,所以还是要有一个必要性的把握。
参数的保护性拷贝不仅仅针对不可变类。每当编写编写方法和构造器时,如果他要允许客户提供的对象进入到内部数据结构中,则有必要考虑一下,客户提供的对象是否有可能是可变的,我是否能够容忍这种可变性。特别是你用到list、map之类连接元素时。
在内部组件返回给客户端的时候,也要考虑是否可以返回一个指向内部引用的数据。或者,不使用拷贝,你也可以返回一个不可变对象。如:Colletions.unmodifiableList(List<? extends T> list)
如果类具有从客户端得到或者返回到客户端的可变组件,类就必须保护性的拷贝这些组件。如果拷贝的成本受到限制,并且类信任他的客户端不会进行修改,或者恰当的修改,那么就需要在文档中指明客户端调用者的责任(不的修改或者如何有效修改)。
特别是当你的可变组件的生命周期很长,或者会多层传递时,隐藏的问题往往暴漏出来就很可怕。
分享到:
相关推荐
C 程序设计课件:第14章 堆与拷贝构造函数.ppt
C++程序设计课件:第14章 堆与拷贝构造函数.ppt
原创demo,仅供交流学习。
Python:pyinstaller库实现打包代码拷贝到另一台无python环境电脑上运行(csdn)————程序.p
可以对制定文件夹进行选择性拷贝,用以解决了某些ide无法增量打包的问题
linux下系统编程:拷贝时缓冲与时间关系(列表与图表输出) 源文件 比较乱 没有分函数 使用格式 copy A B 命令 待拷贝文件 拷贝后的文件 输出不同缓冲大小下 所需拷贝时间 列出数据及图表
点击 :前往-- 前往文件 ---拷贝下面即可: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 然后重启 Xcode ,重新插拔数据线
点击 :前往-- 前往文件 ---拷贝下面即可: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 然后重启 Xcode ,重新插拔数据线
快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高...
换句话说,浅拷贝只复制了对象的第一层元素,而没有递归复制其内部嵌套的对象。因此,当修改原始对象的内部元素时,浅拷贝对象也会受到影响。 深拷贝:深拷贝是创建一个完全独立的新对象,该对象及其内部元素都是...
本文给大家分享了C++箴言:资源管理类的拷贝行为。
深拷贝和浅拷贝一些例子
深拷贝拷贝的是内容,浅拷贝拷贝的是指针。学习笔记分享。
让你对C++的深拷贝和浅拷贝进一步了解,自己制作的,特和大家分享
实现按文件的修改时间来筛选,将筛选出的文件拷贝到指定目录文件夹下。(源代码,直接运行) 将指定目录下的所有文件的修改时间大于或等于指定时间的文件拷贝到目标目录的文件夹下;只有指定目录文件夹下文件的修改...
利用io流编写的简单的文件拷贝小程序,可在控制台进行文件的拷贝.
由于内存的速度比CPU的速度慢得多, 在一些频繁进行 大块内存拷贝的程序中, 内存拷贝会消耗大量的时间, 从而严 重影响程序的性能。通常采用两种方法在现有CPU和内存的 条件下解决这个问题: 一是采用后台程序在CPU ...
js考虑最完善的深拷贝函数,可以深拷贝引用对象和基本对象
可以把指定目录下的所有文件(不管里面有多少层的文件夹)拷贝到指定的目录中。 系统要求:Windows 64-bit 使用方法: 1.解压后双击“拷贝目录内所有文件到指定目录.exe” 2.在根目录中输入想拷贝的目录路径 3.在...
Android 文件拷贝Demo,可实现SD卡以及内部存储之间进行拷贝