JAVA不可变类(immutable)机制与String的不可变性
来源:互联网 发布:东华大学数据库 编辑:程序博客网 时间:2024/04/29 16:04
一、不可变类简介
不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。
二、不可变类的优点
说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?这样的特性对JAVA来说带来怎样的好处?
1.线程安全
不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。
2.易于构造、使用和测试
3....
三、不可变类的设计方法
对于设计不可变类,个人总结出以下原则:
1. 类添加final修饰符,保证类不被继承。
如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。
2. 保证所有成员变量必须私有,并且加上final修饰
通过这种方式保证成员变量不可改变。但只做到这一步还不够,因为如果是对象成员变量有可能再外部改变其值。所以第4点弥补这个不足。
3. 不提供改变成员变量的方法,包括setter
避免通过其他接口改变成员变量的值,破坏不可变特性。
4.通过构造器初始化所有成员,进行深拷贝(deep copy)
如果构造器传入的对象直接赋值给成员变量,还是可以通过对传入对象的修改进而导致改变内部变量的值。例如:
public final class ImmutableDemo { private final int[] myArray; public ImmutableDemo(int[] array) { this.myArray = array; // wrong } }
这种方式不能保证不可变性,myArray和array指向同一块内存地址,用户可以在ImmutableDemo之外通过修改array对象的值来改变myArray内部的值。
为了保证内部的值不被修改,可以采用深度copy来创建一个新内存保存传入的值。正确做法:
public final class MyImmutableDemo { private final int[] myArray; public MyImmutableDemo(int[] array) { this.myArray = array.clone(); } }
- JAVA的不可变类(immutable)机制与String的不可变性
- JAVA不可变类(immutable)机制与String的不可变性
- JAVA不可变类(immutable)机制与String的不可变性
- JAVA不可变类(immutable)机制与String的不可变性
- JAVA不可变类(immutable)机制与String的不可变性
- Java Immutable不可变类
- String类的不可变性
- String 类的不可变性
- 为什么Java的string类要设成immutable(不可变的)
- 为什么Java的string类要设成immutable(不可变的)
- 为什么Java的string类要设成immutable(不可变的)
- Java String是不可变的(immutable)
- String的不可变性
- String的不可变性
- String的不可变性
- String的不可变性
- java String被设计成不可变(immutable)类
- java之String对象的不可变性
- 深入理解Binder(一),从AIDL谈起
- C++预学习
- PHP + MySQL 实现无限分类的2种方法
- C Primer Plus学习 十七 递归
- 将jsp页面的table报表转换到excel报表导出
- JAVA不可变类(immutable)机制与String的不可变性
- 关于数据结构本质的知乎摘抄
- PHP中的数据转换
- linux使用之二更新源
- arduino入门-ubuntu下安装驱动
- jdbc
- hdu acm 1028 Ignatius and the Princess III
- hdu 5127 vector与list的区别
- cocoaPods 安装以及安装过程中出现的问题