Java中的不可变类指的是在对象完成创建之后无法被修改的类。
最典型的就是String,当然还有所有的基本类型的包装类,比如Integer、Long、Boolean等等。
如果要实现一个不可变类,至少需要同时满足以下5个条件:
-
为了防止子类继承父类之后添加了一些可变行为,导致不可变性遭到破坏,需要将类声明为final。
-
为了保证字段只能在构造阶段赋值,并且之后就不能通过外部进行访问或者修改,需要通过private final对字段进行修饰,将变量锁死。
-
需要通过构造函数一次性初始化所有字段。
-
可以提供getter方法,但是不能提供setter或者修改状态的方法。
-
如果类中含有可变对象的引用,需要确保在对象外部无法对这些引用进行修改。
这样一个不可变类,因为不能对它进行修改,所以多线程访问时不需要加锁,天生的线程安全。
又因为它的状态不可变,所以很适合作为缓存的key。
不过,实现这种不可变的代价就是比较费内存。