来自着名的书籍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)
这样的类一旦创建,就无法以任何方式进行修改.