Java 中的 FInal 域可以理解为 C++ 中 const 机制的一种受限版本,用于构建不可变性对象。虽然 Final 类型的域是不能修改的,但是如果 Final 域锁引用的对象是可变的,那么这些被引用的对象也是可以修改的。

 

在 Java 内存模型中,Final 域还有着特殊的语义,Final 域能确保对象的初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象的时候无需同步。

 

即使对象是可变的,通过将对象的某些域生命为 Final 类型,仍然可以简化对状态的判断。因此,限制对象的可变性,就是限制了该对象可能的状态集合。仅仅包含一个或者两个可变状态的 “基本不可变” 对象仍然比包含多个可变状态的对象简单。通过将域声明为 Final 类型,也相当于告诉维护人员,这些域是不会变化的。

 

“除非需要更高的可见性,否则应将所有的域都声明为私有域” 是一个良好的编程习惯,“除非某个域是可变的,否则应将其声明为 Final 域” 也是一个良好的编程习惯。