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”防止重新賦值,從而導致編譯時錯誤。