一、java 语言是一门安全型语言java
- 缓冲溢出、数组越界、非法指针等破坏性内存错误自动免疫
二、尽管安全,若是不采起保护措施,仍是没法与其余类隔离开来程序员
- 好比,有人试图破坏系统的安全性
- 更有可能的是对你的api产生误解的程序员,产生各类不可预期的后果
- 不管如何,编写一些面对不良操做仍保持健壮性的类是很必要的
三、举例以下,即是一段不可变的时间周期api
- 没有对象的帮衬,另外一个类不可能修改对象的内部状态,可是对象容易无心识提供帮衬

- 以下,俩引用是final ,可是 end 对象是可变的(p.end 不可变,可是两者指向同一个对象)

为了不内部信息不受这种攻击,对于构造器的每一个可变参数进行保护性拷贝是必要的数组

- 保护性拷贝,在检查参数有效性以前进行
- 而且有效性检查针对拷贝后的对象
三、对于参数能够被不可信任方子类化的参数,请不要使用clone 方法进行保护性拷贝安全
- 对于非 final类型,不能保证clone 返回的必定是该类型,也多是其子类
- 也可使用别的方法 改变 p.end 的修改权限


- 这样,除了类自己以外,其余任何类都没法访问其任何一个可变域
四、每当编写方法或构造器时数据结构
- 若是容许,客户提供的对象进入数据结构,有必要考虑下该对象是不是可变的
- 考虑类是否可以容忍,对象进入数据结构后还能变化,不能容忍就要考虑保护性拷贝
五、内部组件被返回给客户以前,对他们进行保护性拷贝,道理同样性能
- 在把一个指向内部可变组件的引用返回给客户端时,要考虑清楚,最好使用保护性拷贝
- 长度非零的数组是可变的
只要有可能,都要把不可变对象最为内部组件,这样就没必要再为保护性拷贝操心3d
- 有经验的程序员,都是用 Date.getTime() 返回的基本类型做为时间
六、保护性拷贝会带来相关性能损失,但不都是这样指针
- 若是承诺再也不修改相关对象,能够考虑不进行保护性拷贝
- 文档中必定要写清楚
七、若是方法或构造器的调用,须要移交对象的控制权,这个类就没法自身抵御恶意客户端对象
- 好比对象直接访问被包装的对象,就会破坏包装类对象约束条件