Java 中的 final 與不變性


Java 中的“final”關鍵字可用於定義常量值,以及防止變數、方法或類被更改或覆蓋。另一方面,不變性描述了物件在其整個生命週期中保持恆定狀態的特性。物件一旦建立,其值就不會改變。

“final”關鍵字約束變數、方法和類,但不變性更進一步,保證了物件的整個狀態都得到保留。

讓我們在這篇文章中瞭解 final 與不變性之間的關鍵區別。

Java 中的 Final

Java 中的 final 關鍵字有幾個特點

  • Final 變數:初始化後無法修改其初始值。它們通常用於宣告不可更改或恆定的值。

  • Final 方法:子類無法修改它們,保證它們的行為一致。它們有助於保持重要過程的有效性。

  • Final 類:其他類無法擴充套件它們,保證其實現不會被更改。Final 類通常用於構建安全或實用程式類。

  • 初始化:為了確保 final 變數具有已知的值,必須在宣告時或在建構函式中為其賦值。

  • 效能:使用 final 使編譯器能夠更有效地最佳化程式碼,從而可能提高效能。

  • 安全性:Final 透過防止未經授權修改敏感資料或行為來提高 Java 程式的安全性。

Java 中的不變性

在 Java 中,不可變類是指一旦建立,其物件內容就無法更改的類。要建立不可變類,請遵循以下要求

  • 將類宣告為 final 以防止繼承。

  • 將類的成員變數宣告為 private 以限制直接訪問。

  • 將成員變數宣告為 final 以防止物件建立後修改。

  • 使用帶引數的建構函式用深複製初始化所有欄位,防止透過物件引用進行修改。

  • 在 getter 方法中返回物件的副本(深複製),而不是實際的物件引用,以保持不變性。

透過遵循這些特性,您可以建立您自己的 Java 不可變類,類似於 Integer、Boolean、Byte、Short 和 String 等內建不可變類。

final 和不變性之間的區別

在 Java 程式設計中,理解“final”和“immutable”(不變)之間的區別至關重要。

  • Final:保留物件引用並允許狀態變異

    讓我們從“final”開始。當 Java 中的物件或變數被標記為 final 時,表示在為其賦值後,該引用不能更改為指向另一個物件或變數。請記住,儘管引用是固定的,但使用相關的 setter 方法仍然可以更改物件的狀態。因此,即使引用本身不能更改,您仍然可以使用可訪問的方法來更改物件內部的屬性或特性。換句話說,final 保證了物件引用的穩定性,同時允許更改其內部狀態。

  • Immutable:不變的值和引用靈活性

    現在讓我們關注“immutable”。在 Java 中,不變性是指物件在建立後其實際值不能更改。但是,與 final 不同,您可以修改引用本身並將其分配給另一個物件或變數。這意味著,儘管物件的值保持不變,但您可以更改其引用以指向不同的例項。

  • 應用和範圍:Final 和不變性

    修飾符“final”應用於 Java 中的變數而不是物件。它強調了限制更改引用或變數,同時允許修改物件狀態。另一方面,不變性應用於物件,表示一旦建立,其值就不能更改。理解這兩個概念之間的區別對於確保 Java 程式的預期行為至關重要。

  • 含義:物件地址和狀態可變性

    當我們將物件或變數宣告為 final 時,我們正在強制其地址的永久性。換句話說,引用保持固定,防止對其指向位置進行任何更改。相反,不變性突出表明物件一旦建立,其狀態就不能修改。這意味著物件內部的值不能更改,從而在整個程式執行過程中保持其完整性和一致性。

StringBuffer()

該程式碼演示了 Java 中“final”關鍵字和不變性之間的區別。“final”關鍵字使變數成為常量並防止重新賦值,而不變性意味著物件本身不能被修改。

演算法

  • 步驟 1:宣告一個變數“sb”作為初始值為“Hello”的 final StringBuffer 物件。

  • 步驟 2:使用 append() 方法將“TP”追加到“sb”引用的 StringBuffer 物件。

  • 步驟 3:列印“sb”的更新值,它將是“HelloTP”。

  • 步驟 4:嘗試將新的 StringBuffer 物件重新分配給變數“sb”,這會導致編譯時錯誤。

  • 步驟 5:列印“sb”的值,但由於上一步中的錯誤,此行將不會執行。

示例

// Java program to illustrate difference between final and immutability
 
public class Tutorialspoint {
    public static void main(String[] args)
    {
        final StringBuffer sb = new StringBuffer("Hello");
 
        //  We can make changes even though reference variable sb is final

        sb.append("TP");
 
        System.out.println(sb);
 
        // Compile time error will appear here. This is because the final variable cannot be reassigned

        sb = new StringBuffer("Hello World");
 
        System.out.println(sb);
    }
}

輸出

Tutorialspoint.java:16: error: cannot assign a value to final variable sb
        sb = new StringBuffer("Hello World");
        ^
1 error

結論

總而言之,“final”和不變性在 Java 中具有不同的特性。“final”關鍵字限制了物件引用的重新賦值,但允許修改物件的狀態。

相反,不變性防止更改物件的值,但允許重新分配引用。理解“final”和不變性的應用和範圍對於設計可靠的 Java 程式非常重要。當物件或變數被宣告為 final 時,其地址保持固定,而不變性確保物件內部的值不能被修改。示例程式碼演示了這種差異,其中“final”防止重新賦值,從而導致編譯時錯誤。

更新於: 2023-07-11

1K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告