什么是不可变类(JAVA)
定义
不可变类的意思是,对该类对象实例化后,其对象属性在整个生命周期内不再改变。
如何创建一个不可变类
创建一个不可变类时,需要遵循以下四条规则
- 不要提供任何修改对象状态的方法
- 确保类中的所有方法不被重载
- 确保类中的成员对象为private
- 如果类中存在成员不是基本数据类型或不可变类时,赋值过程中避免直接使用其引用或将对象的引用暴露给外部(自己码的描述,可能不是特别精确严谨。望理解,如有更好的描述还望大神多多指点)
代码例子
这是一个错误的例子 :违背了上述规则中的第四条
原因: 其成员数组变量 i 赋值过程中,直接将参数传递的引用值赋给成员变量 i
final class Kiil{
private int[] i;
public Kiil (int[] i){
this.i=i;
}
public void addFor() {
for(int j=0;j<this.i.length;j++) {
System.out.print("J= "+j+"\n");
}
}
}
上述代码所创建的类满足了前面所提到的前三点规则,但是未满足第四点。因为通过这样的方式直接将参数传递的引用值赋予成员变量。无法保证这个类是一个不可变类。
因为我们从外部改变其参数传递的引用中值的内容,间接的就改变了成员变量 i 的值,无法得到类的不可变,破坏了其封装性。
正确的写法:
final class Kiil{
private int[] i;
public Kiil (int[] i){
this.i=i.clone();
}
public void addFor() {
for(int j=0;j<this.i.length;j++) {
System.out.print("J= "+j+"\n");
}
}
}
将构造函数中 this.i=i
修改为 this.i=i.clone();
,从而使得其类成员变量的引用是非外部可改变。