Java 中的「final」關鍵字可用來定義常數值以及防止變數、方法,或類別被更改或覆寫。另一方面,不變性描述了物件在其存在過程中保持恆定狀態的特徵。物件形成後,其值就不會改變。
變數、方法和類別受到「final」關鍵字的限制,但不變性更進一步,保證了物件的整個狀態得到保留。
讓我們在本文中了解最終與不變性之間的主要差異。
Java中的final關鍵字有幾個特點:
最終變數:初始化後其初始值無法修改。它們經常被用來聲明不可更改或不變的值。
最終方法:它們不能被子類別修改,保證它們的行為一致。它們有助於保持重要程序的有效性。
最終類別:它們無法被其他類別擴展,保證它們的實作不會改變。 Final 類別經常用於建立安全性或實用程式類別。
初始化:為了確保最終變數具有已知值,必須在宣告期間或建構函式中為其賦予值。
效能:final 的使用使編譯器能夠更成功地最佳化程式碼,從而可能提高效能。
安全性:Final 透過防止未經授權的敏感資料或行為變更來提高 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時,我們就強制其位址的永久性。換句話說,引用保持固定,防止其指向的位置發生任何變化。相較之下,不變性強調了物件一旦創建就無法修改其狀態。這意味著物件的內部值無法更改,從而在整個程式執行過程中保持其完整性和一致性。
該程式碼示範了 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中文網其他相關文章!