必要时进行保护性拷贝(39)

一、java 语言是一门安全型语言java

  • 缓冲溢出、数组越界、非法指针等破坏性内存错误自动免疫

二、尽管安全,若是不采起保护措施,仍是没法与其余类隔离开来程序员

  • 好比,有人试图破坏系统的安全性
  • 更有可能的是对你的api产生误解的程序员,产生各类不可预期的后果
  • 不管如何,编写一些面对不良操做仍保持健壮性的类是很必要的

三、举例以下,即是一段不可变的时间周期api

  • 没有对象的帮衬,另外一个类不可能修改对象的内部状态,可是对象容易无心识提供帮衬

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

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

  • 保护性拷贝,在检查参数有效性以前进行
  • 而且有效性检查针对拷贝后的对象

三、对于参数能够被不可信任方子类化的参数,请不要使用clone 方法进行保护性拷贝安全

  • 对于非 final类型,不能保证clone 返回的必定是该类型,也多是其子类
  • 也可使用别的方法 改变 p.end 的修改权限

  • 可变内部域,保护性拷贝

  • 这样,除了类自己以外,其余任何类都没法访问其任何一个可变域

四、每当编写方法或构造器时数据结构

  • 若是容许,客户提供的对象进入数据结构,有必要考虑下该对象是不是可变的
  • 考虑类是否可以容忍,对象进入数据结构后还能变化,不能容忍就要考虑保护性拷贝

五、内部组件被返回给客户以前,对他们进行保护性拷贝,道理同样性能

  • 在把一个指向内部可变组件的引用返回给客户端时,要考虑清楚,最好使用保护性拷贝
  • 长度非零的数组是可变的

只要有可能,都要把不可变对象最为内部组件,这样就没必要再为保护性拷贝操心3d

  • 有经验的程序员,都是用 Date.getTime() 返回的基本类型做为时间

六、保护性拷贝会带来相关性能损失,但不都是这样指针

  • 若是承诺再也不修改相关对象,能够考虑不进行保护性拷贝
  • 文档中必定要写清楚

七、若是方法或构造器的调用,须要移交对象的控制权,这个类就没法自身抵御恶意客户端对象

  • 好比对象直接访问被包装的对象,就会破坏包装类对象约束条件
相关文章
相关标签/搜索