[英]point of having an instance variable as final?
將實例變量作為最終變量有什么意義?
那么將該變量設置為靜態最終變量不是更好嗎?
因為如果它不能被任何對象更改,那么它與類(靜態)變量相同,對嗎?
不。 static
意味着它在類的所有實例中都是相同的。 final
意味着它在初始分配后不可分配。 因此,對於非靜態最終變量,兩個實例可能具有不同的值。
您可能希望將變量設為 final 的原因有很多; 最好的之一是清晰度。 如果我閱讀了一個方法並注意到 foo 是最終的,我不必擔心它在下面的位置發生變化 - 因為它不是; 它不能。 我可以對帶有 final 變量的代碼進行更多更改而不必擔心(“我在 bar 之前或之后更改了 foo 的值,這有關系嗎?”),因為我知道某些變量不會更改。 它還側重於那些可能發生變化的變量我的注意-他們是值得更多的關注的人。
兩個原因:
1) 從類設計的角度來看,它允許程序員依賴於字段自實例化后不會改變的事實——所謂的“ 不可變對象”(應用於類成員,而不是對象的引用)。 Java教程說:
不可變對象在並發應用程序中特別有用。 因為它們不能改變狀態,所以它們不會被線程干擾破壞或在不一致的狀態下被觀察到。
不可變對象是各種編程風格的基石,例如純函數式編程。
2)第二個原因是JVM優化。 如果所有字段都是最終的,那么 JVM 知道對象的狀態不能改變,因此它可以進行許多優化,例如省略線程安全檢查等。
我猜您正在考慮簡單的情況,例如:
private final int num = 3;
可以更好地寫成:
private static final int NUM = 3;
但是,通常您會引用可變的對象,因此不能在類之間共享:
private final List<Node> children = new ArrayList<Children>();
或者,一個傳入或派生在構造函數中的值:
public final class MyThing {
private final String name;
public MyThing(String name) {
this.name = name;
}
[...]
}
注意: final
字段可以在構造函數(或實例初始化器)中分配,而不僅僅是作為聲明的一部分。
您可以為其分配一個特定於對象實例的值,而使用靜態類變量則無法做到這一點。
它可以防止其他程序員從做愚蠢的事情,他們不應該想試試做...
class A{
public final int x;
A(int arg){
x = arg; // This is legal !!!
}
}
public class HelloWorld{
public static void main(String []args){
A a = new A(1);
A b = new A(2);
System.out.printf("a.x = %d, b.x = %d", a.x, b.x);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.