阅读《Effictive Java》笔记
不可变类:其实例不可被修改 每个实例地信息都需要在创建地时候给出。不可变类有:String 基本类型地封装类、BIgInteger和BigDecimal
要使类成为不可变类需要遵循下面五条规则:
函数(functional)的做法:对操作数进行运算但并不修改它
对应 过程的(procedural)或者命令式的(imperative):将过程作用在操作数上,并且会改变他们的状态
不可变对象的优点:
1、简单,因为整个生命周期中不可能发生改变所有可以不需要做额外的工作来维护约束关系
2、本质上是线程安全的,不要求同步,可以自由得被共享
鼓励客户端尽可能得重用现有的实例,对于常用的值可以提供公有静态final(public static final)方法,进一步扩展后提供静态工厂把频繁请求的实例缓存起来(所有基本类型的包装类和BigInteger都有这样的方法:)
缺点是:每个不同的值都需要一个单独的对象
为了确保不可变性,不可变类不允许被子类化有两种方式:
1、用final修饰类
2、让所有构造器都变成私有的或者包级私有的,并添加静态工厂方法来替代公有的构造器(更加灵活)
当不可变类需要实现序列化时:
不可变类中包含了指向可变对象的域时,必须提供显示的readObject或者readResolve方法,或者ObjectOutPutStream.writeUnshared和 ObjectInputStream.readUnshared,否则攻击者可以通过不可变类穿件可变的实例(具体参考《Effictive java》第二版 76条)