最终字段真的可以防止Java的可变性吗?

Gee*_*eek 7 java immutability

来自着名的书籍Java Concurrency in Practice chapter 3.4.1 Final fields

正如将所有字段设为私有一样是好的做法,除非它们需要更高的可见性[EJ第12项],所以将所有字段设为最终都是一个好习惯,除非它们需要是可变的.

我对Java中最终引用的理解:最终引用/字段只是阻止该字段重新初始化,但如果它引用了一个可变对象,我们仍然可以改变它的状态,使其变为可变.所以我很难理解上面的引用.你怎么看 ?

rad*_*dai 13

最终字段阻止您更改字段本身(通过使其"指向"某个其他实例),但如果该字段是对可变对象的引用,则不会阻止您执行此操作:

public void someFunction (final Person p) {
    p = new Person("mickey","mouse"); //cant do this - its final
    p.setFirstName("donald");
    p.setLastName("duck");
}
Run Code Online (Sandbox Code Playgroud)

上面的引用p是不可变的,但引用指向的实际Person是可变的.当然,你可以使类Person成为一个不可变的类,如下所示:

public class Person {
    private final String firstName;
    private final String lastName;
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    //getters and other methods here
}
Run Code Online (Sandbox Code Playgroud)

这样的类一旦创建,就无法以任何方式进行修改.