首頁 >Java >java教程 >Java中的Final與不可變性比較

Java中的Final與不可變性比較

WBOY
WBOY轉載
2023-08-26 21:37:051268瀏覽

Java中的Final與不可變性比較

Java 中的「final」關鍵字可用來定義常數值以及防止變數、方法,或類別被更改或覆寫。另一方面,不變性描述了物件在其存在過程中保持恆定狀態的特徵。物件形成後,其值就不會改變。

變數、方法和類別受到「final」關鍵字的限制,但不變性更進一步,保證了物件的整個狀態得到保留。

讓我們在本文中了解最終與不變性之間的主要差異。

Java 最終版本

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

  • 最終變數:初始化後其初始值無法修改。它們經常被用來聲明不可更改或不變的值。

  • 最終方法:它們不能被子類別修改,保證它們的行為一致。它們有助於保持重要程序的有效性。

  • 最終類別:它們無法被其他類別擴展,保證它們的實作不會改變。 Final 類別經常用於建立安全性或實用程式類別。

  • 初始化:為了確保最終變數具有已知值,必須在宣告期間或建構函式中為其賦予值。

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

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

Java 中的不變性

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

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

  • 將類別的資料成員宣告為私有以限制直接存取。

  • 將資料成員宣告為final,以防止在物件建立後進行修改。

  • 使用參數化建構函式透過深拷貝初始化所有字段,防止透過物件參考進行修改。

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

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

最終與不變性之間的差異

當涉及 Java 程式設計時,理解「final」和「immutable」之間的區別至關重要。

  • 最終:保留物件引用並允許狀態突變

    讓我們從「最終」開始。當一個物件或變數在Java中被標記為final時,這表示在給它一個值之後,該參考不能更改為指向另一個物件或變數。重要的是要記住,儘管引用是固定的,但使用相關的 setter 方法仍然允許您更改物件的狀態。因此,即使引用本身無法更改,您仍然可以使用可存取的方法來更改物件的內部屬性或屬性。換句話說,final 確保物件引用的穩定性,同時允許更改其內部狀態。

  • 不可變:不可變值和引用靈活性

    現在讓我們將注意力轉向「不可變」。在Java中,不變性是指物件在創建後其實際值不能更改。但是,與 Final 不同的是,您可以修改引用本身並將其指派給另一個物件或變數。這意味著雖然物件的值保持不變,但您可以更改其引用以指向不同的實例。

  • 應用程式與範圍:Final 和不變性

    修飾詞「final」適用於 Java 中的變數而不是物件。它強調對更改引用或變數的限制,同時允許修改物件的狀態。另一方面,不變性適用於對象,表示它們的值一旦創建就不能更改。必須了解這兩個概念之間的區別,以確保 Java 程式達到預期的行為。

  • 意義:物件位址和狀態可變性

    當我們將一個物件或變數宣告為final時,我們就強制其位址的永久性。換句話說,引用保持固定,防止其指向的位置發生任何變化。相較之下,不變性強調了物件一旦創建就無法修改其狀態。這意味著物件的內部值無法更改,從而在整個程式執行過程中保持其完整性和一致性。

StringerBuffer()

該程式碼示範了 Java 中「final」關鍵字和不變性之間的差異。 “final”關鍵字使變數成為常數並防止重新分配,而不變性意味著物件本身不能被修改。

演算法

  • 第 1 步:宣告變數「sb」作為最終 StringBuffer 對象,初始值為「Hello」。

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

  • 第 3 步:列印「sb」的更新值,即「HelloTP」。

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

  • 第五步:印出「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

結論

總而言之,「最終」和不變性在 Java 中具有截然不同的特徵。 “final”關鍵字限制物件參考的重新分配,但允許修改物件的狀態。

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

以上是Java中的Final與不可變性比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除