使用Java switch 語句時,確保case 標籤中使用的表達式非常重要是常數表達式。常數表達式是在編譯時計算並產生常數值的表達式。這是必要的,因為編譯器需要知道表達式的確切值才能決定執行哪種情況。
在下面的範例中,我們有一個包含三個靜態常數的類別:
public abstract class Foo { ... public static final int BAR; public static final int BAZ; public static final int BAM; ... }
然後我們有一個方法,使用switch 語句根據常數取得相關字串:
public static String lookup(int constant) { switch (constant) { case Foo.BAR: return "bar"; case Foo.BAZ: return "baz"; case Foo.BAM: return "bam"; default: return "unknown"; } }
但是,當我們嘗試編譯這個時程式碼中,我們在三個case標籤中的每一個上都得到了常數表達式所需的錯誤。這是因為,雖然從欄位初始化後執行的任何程式碼的角度來看這些常數都是常數,但它們不是 Java 語言規範 (JLS) 所要求的意義上的編譯時常數。
具體來說,JLS 將常數表達式定義為可以在編譯時計算以產生常數值的表達式。這意味著表達式不能包含任何本身不是常數的變量,或任何本身不是常數的操作。
在我們的範例中,Foo.BA* 常數不是編譯時常數,因為它們沒有初始化器。要解決這個問題,我們可以簡單地使用編譯時常數表達式初始化常數:
public abstract class Foo { ... public static final int BAR = 1; public static final int BAZ = 2; public static final int BAM = 3; ... }
現在,當我們編譯程式碼時,它應該編譯成功。
也需要注意在 switch 語句中可以使用枚舉來代替 int 常數。但是,枚舉有一些 int 常數沒有的限制。例如,枚舉必須具有預設大小寫,即使枚舉的每個已知值都有大小寫。此外,case 標籤必須全部是明確枚舉值,而不是計算結果為枚舉值的表達式。
以上是為什麼我的 Java Switch 語句在使用靜態常數時會拋出「需要常數表達式」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!