不可变对象和Biulder模式(面试问题)
2015-08-04 00:39
555 查看
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可以多态。
具体实现起来就是把属性全部变成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可以多态。
相关文章推荐
- 面试常见问题
- 黑马程序员---OC面向对象总结
- 面试备用
- 黑马程序员_Java基础:集合总结
- 100分程序员的8个习惯
- 如何在面试中发现优秀程序员
- 程序员面试中的5个杀手锏问题
- 一格“职场管家”,程序员职场新宠!
- 多亏我做了一名程序员!
- 做快乐的程序员
- 22条日常技巧助程序员提高工作效率
- 小小程序员的学习计划
- 失败的面试经历
- iOS 一些面试问题(一)
- 黑马程序员----SQL约束介绍
- 20个高级Java面试题汇总
- 黑马程序员-ios学习笔记 Foundation 中的 NSArray
- TalkingData的研发面试题目
- (剑指Offer)面试题54:表示数值的字符串
- 好的程序员绝对是靠练出来的。