簡體   English   中英

有一個實例變量作為最終的點?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM