摘自著名著作“Java并发在实践中的应用第3.4.1章最终字段”
正如使所有字段都是私有的良好实践,除非它们需要更大的visibilityEJ项目12,但是最好的做法是使所有字段成为最终的,除非它们需要是可变的。
我对Java中的最终引用的理解是:最后的引用/字段只会阻止该字段重新初始化,但是如果它引用了一个可变的对象,我们仍然可以更改它的状态呈现为可变的。所以我很难理解上面的话。你觉得呢?
发布于 2013-02-09 12:14:51
最后的字段阻止您更改字段本身(通过将其“指向”到其他实例),但是如果字段是对可变对象的引用,则没有什么可以阻止您这样做:
public void someFunction (final Person p) {
p = new Person("mickey","mouse"); //cant do this - its final
p.setFirstName("donald");
p.setLastName("duck");
}上面的参考p是不变的,但是引用所指向的实际人员是可变的。当然,您可以使类人成为一个不可变的类,如下所示:
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
}此类类一旦创建,就不能以任何方式进行修改。
发布于 2013-02-09 12:15:36
这句话只说了这句话:
使所有字段成为最终字段,除非它们是可变的。
可变字段是以后可以更改为指向另一个对象的字段。如果字段是final,它仍然可以引用可变对象(例如,java.util.Date)。因此,字段是不可变的(总是指向同一个对象),但这个对象是可变的。
发布于 2013-02-09 12:23:11
在java中,类似于以下内容:
int *const p=&something //constant pointer.in c++. you can't use this pointer to change something but that something can be changed with its own.
在java中,最后的字段不能被更改,但是它们所引用的对象可能会因其自身而改变。例如。'this'是最终的,您不能将任何东西分配给this,但是您可以将任何东西分配给它所引用的对象。
从你的问题:
it is a good practice to make all fields final unless they need to be mutable.
为了避免对原作的任何修改(无论是逻辑上的还是偶然的),让它们成为最终的总是好的。
https://stackoverflow.com/questions/14787990
复制相似问题