正文
使用 Immutable 模式的要点
实例创建后,状态不再发生变化
如下定义一个 Persion 类,注意 class 为 final,表示不能被继承,并且类的属性也是不可变的
1 | public final class Persion { |
比如下面这个类就不是不可变的,原因在于 Point 不是不可变的,因为外部可能还保存 Point 的引用
1 | public final class Line { |
上面的类可以将 Point 类改为不可变的,也可以改一下 Line 的构造方法,让外部不再持有引用,但是这样反射可能还是可以修改,一般这种类在程序中表示常量,而可以用枚举
1 | public final class Line1 { |
实例是共享的,且被频繁访问时
Immutable 模式的优点是"不需要使用synchronized进行保护".能够在不失去安全性和生存性的前提下提高性能
考虑成对的 mutable 类和 immutable 类
比如jdk中的 StringBuffer 和 String 类. StringBuffer 类表示字符串的 mutable 类.它表示字符串可以随便改写,为了确保安全,改写时需要妥善使用 synchronized.而 String 类表示字符串的 immutable 类
StringBuffer 类中有一个以 String 为参数的构造函数,而 String 类中也有一个以 StringBuffer 为参数的构造函数.也就是说, StringBuffer 和 String 实例可以互相转换