摘自名著《Java Concurrency in Practice》第3.4.1章Final fields
正如将所有字段设为私有,除非它们需要更高的可见性[EJ Item 12] 是一个很好的做法,将所有字段设为最终字段是一个很好的做法,除非它们需要是可变的。
我对 Java 中最终引用的理解:最终引用/字段只是防止该字段重新初始化,但如果它引用了一个可变对象,我们仍然可以更改它的状态,使其变为可变。所以我很难理解上面的报价。你怎么看 ?
摘自名著《Java Concurrency in Practice》第3.4.1章Final fields
正如将所有字段设为私有,除非它们需要更高的可见性[EJ Item 12] 是一个很好的做法,将所有字段设为最终字段是一个很好的做法,除非它们需要是可变的。
我对 Java 中最终引用的理解:最终引用/字段只是防止该字段重新初始化,但如果它引用了一个可变对象,我们仍然可以更改它的状态,使其变为可变。所以我很难理解上面的报价。你怎么看 ?
final 字段会阻止您更改字段本身(通过使其“指向”其他实例),但如果该字段是对可变对象的引用,则没有什么可以阻止您这样做:
public void someFunction (final Person p) {
p = new Person("mickey","mouse"); //cant do this - its final
p.setFirstName("donald");
p.setLastName("duck");
}
上面的引用 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
}
这样的类一旦创建,就不能以任何方式修改。
这句话只说了什么:
使所有字段成为最终字段,除非它们需要是可变的
可变字段是您以后可以更改为指向另一个对象的字段。如果字段是final
,它仍然可以引用可变对象(例如java.util.Date
)。因此该字段是不可变的(总是指向同一个对象),但这个对象是可变的。
在 java final 中与此类似:
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.
为了避免对原始文件进行任何修改(逻辑上或意外),将它们定稿总是好的。
根据 Java 代码约定,最终变量被视为常量并以所有大写字母编写,例如
private final int COUNT=10; // immutable -> cannot be changed
将集合引用变量设为 final 意味着只有引用不能更改,但您可以在集合内添加、删除或更改对象。例如:
private final List Loans = new ArrayList();
list.add(“home loan”); //valid
list.add("personal loan"); //valid
loans = new Vector(); //not valid
阅读更多:http: //javarevisited.blogspot.com/2011/12/final-variable-method-class-java.html#ixzz2KP5juxm0
回答您的问题:是的,如果您正确使用它们。
无视报价。时不时地用final
's 涂抹代码几乎没有任何好处。作者的目标是一种良好的实践,但在大型代码库中,看到所有内容都是最终的,这会掩盖意图,使阅读代码变得更加困难和模糊 - 并且可能几乎没有任何好处。
一般来说,有两所学校。选择你的:
一个是不使用final
,除非您真的希望那些阅读您编写的代码的人知道这个字段在某些方面是特殊的并且不容小觑。
另一个迷恋final
并想要它无处不在。它不太流行。Renauld Waldura是这个想法的优秀传播者。阅读他的链接条目,标题为“Final word on final keyword”,这是一本很好且深入的读物。
就我而言,我只是想让您知道这已final
更改,并且并不总是意味着不可变,正如您可以在Heinz Kabutz 的 Java 专家时事通讯中看到的那样。他将带您了解它在不同 Java 中的工作方式,随时获取他的代码并检查您使用的 Java。