最小化可变性

不可变类简单来说是其实例不能被修改的类。 包含在每个实例中的所有信息在对象的生命周期中是
固定的,因此不会观察到任何变化。 Java 平台类库包含许多不可变的类,包括 String 类、基本类型
包装类以及 BigInteger 类和 BigDecimal 类。 有很多很好的理由:不可变类比可变类更易于设
计,实现和使用。 他们不容易出错,并且更安全

要使一个类成为不可变类,请遵循以下五条规则:
1. 不要提供修改对象状态的方法(也称为 mutators,设值方法)。
2. 确保这个类不能被继承。 这可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏类
的不可变行为。 防止子类化,通常是通过 final 修饰类,但是我们稍后将讨论另一种方法。
3. 把所有字段设置为 final通过系统强制执行的方式,清楚地表达了你的意图。 另外,如果一个
新创建的实例的引用在缺乏同步机制的情况下从一个线程传递到另一个线程,就必须保证正确的行
为,正如内存模型[JLS17.5; Goetz06 16] 所述。
4. 把所有的字段设置为 private这可以防止客户端获得对字段引用的可变对象的访问权限,并直
接修改这些对象。 虽然技术上允许不可变类具有包含基本类型数值的公有的 final 字段或对不
可变对象的引用,但不建议这样做,因为这样使得在以后的版本中无法再改变内部的表示状态(详
见第 15 16 条)。
5. 确保对任何可变组件的互斥访问。 如果你的类有任何引用可变对象的字段,请确保该类的客户端
无法获得对这些对象的引用。 切勿将这样的属性初始化为客户端提供的对象引用,或从访问方法
返回属性。 在构造方法,访问方法和 readObject 方法(详见第 88 条)中进行防御性拷贝(详
见第 50 条)

你可能感兴趣的:(最小化可变性)