什么是不可变类?
不可变类是指,一旦一个类的对象被创建出来,在其整个生命周期中,它的成员变量就不能被修改
不可变类的所有数据域都是私有的,且没有对任何一个数据域提供公共的设置方法。一个类的所有数据域都是私有的且没有修改器并不意味着它一定是不可变类。
成为不可变类需要满足的条件有:
1:所有数据域都是私有的(private)
2:不对任何的成员变量提供改变值得方法(set/getter method)
3:确保所有得方法不会被重载,手段有两种,一种是使用(final class)强不可变类,另一种是在所有的类方法前加final
4:如果一个成员变量在初始化的时候没有私有化(private)那么在使用该成员变量的时候需要使用clone使其不可变
5:没有返回一个指向可变数据域的引用的访问器方法
例子:
final class InnerClass_date{
private Date date;
//构造方法
public InnerClass_date(Date date){
this.date = date;
}
public void printStr(){
System.out.println("date : " + date);
}
}
final class InnerClass_str{
private String str;
//构造方法
public InnerClass_str(String str){
this.str = str;
}
public void printStr(){
System.out.println("str : " + str);
}
}
final class InnerClass_date2{
private Date date;
//构造方法
public InnerClass_date2(Date date){
// 解除了引用关系,通过克隆,生成了一个新的对象
this.date = (Date) date.clone();
}
public void printStr(){
System.out.println("date : " + date);
}
}
不可变类的优点:
- 易于构造、测试和使用
- 天然线程安全、没有同步线程的问题
- 不需要实现clone方法
- 引用不可变类的实例时,不需要考虑实例的值会发生变化