Java 中的靜態最終變數
1. 概述
簡單來說, static final
變量,也稱為常數,是 Java 中創建初始化後不會更改的類別變量的關鍵功能。然而,在static final
物件參考的情況下,物件的狀態可能會改變。
在本教程中,我們將學習如何宣告和初始化常數變數。此外,我們也將討論它們的用處。
2. static final
變數
static
關鍵字將變數與類別本身關聯,而不是與類別的實例關聯。
此外, final
關鍵字使變數不可變。初始化後其值不能改變。
兩個關鍵字的組合有助於建立一個常數。它們大多使用大寫字母和底線來分隔單字來命名。
2.1.初始化static final
變數
以下是如何聲明static final
欄位並指派值的範例:
class Bike {
public static final int TIRE = 2;
}
在這裡,我們建立一個名為Bike
的類,其中包含一個名為TIRE
的常數類變量,並將其初始化為 2。
或者,我們可以透過static
初始化塊初始化變數:
public static final int PEDAL;
static {
PEDAL = 5;
}
這將編譯而不會出現錯誤:
@Test
void givenPedalConstantSetByStaticBlock_whenGetPedal_thenReturnFive() {
assertEquals(5, Bike.PEDAL);
}
以下是常量變數的一些關鍵規則:
- 我們必須在宣告時或在
static
初始化區塊中進行初始化 - 初始化後我們無法重新分配它
嘗試在初始化範圍之外對其進行初始化將導致異常。
此外,我們無法透過建構函式初始化它,因為當我們建立類別的實例時會呼叫建構函式。靜態變數屬於類別本身,而不屬於單一實例。
2.2. static
final
對象
我們也可以建立static final
物件參考:
public static final HashMap<String, Integer> PART = new HashMap<>();
由於PART
引用是常數,因此無法重新分配:
PART = new HashMap<>();
上面的程式碼拋出異常,因為我們為不可變變數分配了一個新引用。
但是,我們可以修改物件的狀態:
@Test
void givenPartConstantObject_whenObjectStateChanged_thenCorrect() {
Bike.PART.put("seat", 1);
assertEquals(1, Bike.PART.get("seat"));
Bike.PART.put("seat", 5);
assertEquals(5, Bike.PART.get("seat"));
}
在這裡,我們可以更改seat
的值,儘管最初將其設為 1。儘管 PART 是一個恆定的引用,但我們還是改變了PART
的內容。只有引用本身是不可變的。
值得注意的是, final
關鍵字僅使原始類型、 String
和其他不可變類型成為常數。對於對象,它僅使參考恆定,但可以更改對象的狀態。
3. 為什麼常數有用
使用static final
變數有幾個優點。它提供了更好的效能,因為它的值是在編譯時內聯的,而不是執行時間值查找。
此外,將可重用值宣告為常數可以避免重複文字。常數可以在程式碼中的任何位置重複使用,具體取決於存取修飾符。具有private
存取修飾符的常數只能在類別中使用。
此外,基元或String
類型的static final
變數是線程安全的。當在多個執行緒之間共用時,其值保持不變。
最後,為常數值提供語義名稱可以提高程式碼的可讀性。此外,它還使程式碼能夠自我記錄。例如, java.math
套件提供了像PI
這樣的常數:
@Test
void givenMathClass_whenAccessingPiConstant_thenVerifyPiValueIsCorrect() {
assertEquals(3.141592653589793, Math.PI);
}
Math.PI
以可重複使用的方式封裝了數學常數值。
4。結論
在本文中,我們學習如何宣告和初始化常數變數。此外,我們還重點介紹了它的一些用例。
final static
變數定義類別級常數。但是, static final
物件可能仍然是可變的,即使引用無法更改。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。