String就是一个典型的不可变对象。外界的操作不能改变它,如果尝试改变都会返回一个新的String对象。
具体实现起来就是把属性全部变成private 和 final的,这个类也是final的不可继承,以免子类进行修改。对外暴露方法读操作,如果是写操作(修改)那么方法就要返回一个新的对象,原来那个不变。不可变对象是线程安全的。
String 设计成不可变对象是综合内存,同步,数据结构以及安全等方面的考虑。
1 效率,通过使用常量池和智能编译技术可以让相同字面值的字符串变量指向内存中String对象,如果是可变的那么一个变了就会影响其他的。
2 设计,经常用String的hashCode作为Map的key,String不可变,hashCode就是唯一的。
3 安全性,String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。
Biulder模式是创建一个复杂对象的时候可以考虑的模式。
Biulder对象的职责是做每一个细节。
Designer对象的职责是设计一个产品需要哪些具体步骤, 然后告诉Biulder该怎么一步一步做。
Biulder在做的过程中,一直持有那个半成品的引用。最后去找Biulder要制造出的产品。
这个设计的好处是Biulder可以多态。