今天突然想起了一道面试题,简析不可变性 在编程中的优势?
优势
- 并发安全
- 函数式编程中大量利用了不可变数据结构
- 性能(不好说,好像略低于原始结构),但是可以利用缓存
- 不会被黑客攻击,比如String
- 省内存,比如String Intern机制
- 可以避免NULL引用
如何写一个不可变类
- 将类声明为final,所以它不能被继承
- 将所有的成员声明为私有的,这样就不允许直接访问这些成员
- 对变量不要提供setter方法
- 将所有可变的成员声明为final,这样只能对它们赋值一次
- 通过构造器初始化所有成员,进行深拷贝(deep copy)
- 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝
一个Demo
1 | package cb; |
也可以使用建造者模式创建不可变类
当成员变量非常多时,适合用这种方法
http://www.importnew.com/7860.html
比如在这篇文章中,创建不可变的Map
String源码解析
https://juejin.im/post/59fffddc5188253d6816f9c1
关于String的各种问题
https://blog.csdn.net/qq_34490018/article/details/82110578
为什么StringBuffer和StringBuilder就可变?
因为成员变量value数组没有被final修饰,所以可以修改他的引用变量的值,即可以引用到新的数组对象。所以StringBuilder对象是可变的
参考
http://www.importnew.com/7535.html
http://www.importnew.com/14027.html