Final的具体含义
先看一段程序:
public class Main {
final Set<String> set=new TreeSet<>();
public Main(){
set.add("oneslide");
set.add("icywater");
set.add("hello");
}
public static void main(String[] args) {
Main main=new Main();
System.out.println(main.set);
main.set.remove("icywater");
System.out.println(main.set);
}
}
输出:
[hello, icywater, oneslide]
[hello, oneslide]
final对象修饰Set,但是set去能够被成功移除一个元素。这是为什么?
final修饰的对象不能被重新赋予引用,但是对象的成员如果不是final的话,是可以被改变的。
Immutable
Immutable对象(状态不变的对象)的定义取自Java Concurrency in practice
一个对象是Immutable意味着三点:
- 对象构建之后,所有状态不再改变,包括其成员和成员的成员。
- 所有的字段都是final
- 不存在this引用逃逸问题
基于这几点final对象是硬核线程安全的,可以放心被不同对象读取状态,不存在中间状态的概念。