版权声明:本文为博主原创文章,未经博主允许不得转载,转载请务必注明出处: https://blog.csdn.net/MaybeForever/article/details/89105967
不可变类(immutable class)是指当创建了这个类的实例后,就不允许修改它的值了,也就是说,一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了。它有点类似于常量(const),即只允许别的程序读,不允许别的程序进行修改。
在Java类库中,所有基本类型的包装类都是不可变类,例如Integer、Float等。此外,String也是不可变类。
要创建一个不可变类需要遵循下面4项基本原则:
(1)类中所有成员变量被private所修饰。
(2)类中没有写或者修改成员变量的方法,例如setXXX,getXXX,只提供构造函数(最好是带参数的),一次生成,永不改变。
(3)确保类中所有方法不会被子类覆盖,可以通过把类定义为final或者把类中的方法定义为final来达到这个目的。
(4)如果一个类成员不是不可变量,那么在成员初始化或者使用get方法获取该成员变量时,需要通过clone方法来确保类的不可变性。
package com.haobi;
import java.util.Date;
/*
* 不可变类
*/
class ImmutableClass{
private Date d;
public ImmutableClass(Date d) {
this.d = (Date)d.clone();//解除引用关系
}
public void printState() {
System.out.println(d);
}
public Date getDate() {
return (Date)d.clone();
}
}
public class Immutable {
public static void main(String[] args) {
Date d = new Date();
ImmutableClass ic = new ImmutableClass(d);
ic.printState();
d.setMonth(5);
ic.printState();
}
}
//程序输出结果如下:
Mon Apr 08 20:24:49 CST 2019
Mon Apr 08 20:24:49 CST 2019
Java语言中之所以设计很多不可变类,主要是不可变类具有使用简单、线程安全、节省内存等优点,但不可变类也有其缺点,例如,不可变类的对象会因为值的不同而产生新的对象,从而导致无法语料的问题。