如果一个对象的状态在创建以后就不会再改变, 那么就可以认为它是不可变对象. 因为这些对象无法被修改, 所以不需要考虑多线程下的同步问题, 这使得不可变对象在多线程程序中能够发挥重大作用.
如下所示, String 对象就是一个不可变对象.
对于 firstName 一些列的操作 (连接 " " 和 lastName) 并不会修改这些字符串中的任何一个, 而是会重新创建一个新的对象来存放 fullName.
自定义一个不可变对象
如下的规则能够帮助我们创建一个不可变的对象:
不要提供 setter 方法. 一般 setter 方法都是用来提供修改对象 field 的, 既然是不可变的对象, 那么肯定没有修改功能的, 所以也不要提供 setter 方法.
把所有的对象 field 都设置为 final 和 private. 这能够保证在对象外部是无法访问到对象内部的 filed 的.
不允许派生类覆盖方法, 最简单的办法就是把类定义为 final 的, 这样就直接不能够派生了. 更加优雅的做法是把构造方法设置 private 的, 然后提供相应的工厂方法来实例化它.
如果类的字段是其它可变对象的引用, 它们也要被设置为不允许修改: a, 不要提供修改这些可变字段的方法. b, 不要对外暴露这些可变对象的引用.
演示如何定义一个不可变对象
不可变对象的好处
不可变对象更容易创建, 测试和使用, 因为他们没有任何的副作用.
它们更加容易被缓存起来, 同一个对象不会被修改, 所以不需要考虑缓存不一致的问题.
真正的不可变对象肯定是线程安全的.
来源: http://www.bubuko.com/infodetail-3051699.html